जब मेरे पास एक टेबल होता है तो मुझे उदाहरण के लिए MySQL क्वेरी में ईवेंट के बीच अधिकतम अंतर पुनर्प्राप्त करने की आवश्यकता होती है

time/event
1/a
2/a
5/a
7/a
1/b
4/b
15/b

इस मामले में उत्तर होना चाहिए (15-4) इसलिए 11/बी

तालिका को क्रमबद्ध नहीं किया गया है यह सिर्फ मेरी समस्या का प्रदर्शन करने के लिए था

1
romrom123 3 अक्टूबर 2018, 14:47

3 जवाब

सबसे बढ़िया उत्तर

मान लें कि आपके पास LEAD फ़ंक्शन तक पहुंच नहीं है, तो आप अगली पंक्ति खोजने के लिए तालिका में स्वयं शामिल हो सकते हैं:

SELECT curr.time, curr.event, MIN(next.time) - curr.time AS diff
FROM testdata AS curr
INNER JOIN testdata AS next ON next.event = curr.event AND next.time > curr.time
GROUP BY curr.time, curr.event
ORDER BY diff DESC
LIMIT 1

नतीजा:

+------+-------+------+
| time | event | diff |
+------+-------+------+
|    4 | b     |   11 |
+------+-------+------+

यहां बताया गया है कि बिना छँटाई और सीमा के परिणाम कैसा दिखेगा:

+------+-------+------+
| time | event | diff |
+------+-------+------+
|    1 | a     |    1 |
|    2 | a     |    3 |
|    5 | a     |    2 |
|    1 | b     |    3 |
|    4 | b     |   11 |
+------+-------+------+
0
Salman A 3 अक्टूबर 2018, 15:05

आपको घटना के लिए पिछली या अगली बार की आवश्यकता है। मैं एक सबक्वायरी का सुझाव दूंगा:

select t.*
from (select t.*,
             (select t2.time
              from t t2
              where t2.event = t.event and t2.time < t.time
              order by t2.time desc
              limit 1
             ) as prev_time
      from t
     ) t
where prev_time is not null
order by (time - prev_time) desc
limit 1;
0
Gordon Linoff 3 अक्टूबर 2018, 14:50

जबकि गॉर्डन के सुझाव को काम करना चाहिए (उपनाम नामों को निर्दिष्ट करना जो टेबल नामों के समान हैं, @ गॉर्डन?) यह बहुत धीमा होगा (ओ (एन ^ 2))।

CREATE FUNCTION maxgap()
RETURNS VARCHAR(30)
READS SQL DATA
BEGIN
   DECLARE prevtime INT;
   DECLARE prevevent VARCHAR(20) DEFAULT '';
   DECLARE curtime INT;
   DECLARE curevent VARCHAR(20);
   DECLARE maxtime INT;
   DECLARE maxevent VARCHAR(20);
   DECLARE finished INTEGER DEFAULT 0;

   DECLARE curs CURSOR FOR
      SELECT UNIX_TIMESTAMP(time), event FROM yourtable ORDER BY event,time;
   DECLARE CONTINUE HANDLER 
      FOR NOT FOUND SET finished = 1;

   get_records: LOOP
      FETCH curs INTO curtime, curevent;
      IF finished = 1 THEN 
           LEAVE get_records;
      END IF;
      IF (curevent != prevevent) THEN
         SET prevtime=curtime;
         SET prevevent=curevent;
      END IF 
      IF (maxtime<curtime-prevtime) THEN
         SET maxtime=curtime-prevtime;
         SET maxevent=curevent;
      END IF
    END LOOP get_records;
    CLOSE curs;

    RETURN (CONCAT(maxtime, '/', maxevent));

  END$$

(चयनित सैटमेंट में वेरिएबल्स का उपयोग करके समान व्यवहार बनाना संभव होना चाहिए - लेकिन इसके बारे में सोचने से मेरे सिर पर चोट लगती है)।

0
symcbean 3 अक्टूबर 2018, 15:15