चरण दर चरण स्पष्टीकरण:
सबसे पहले आप टेबल को नाम और टाइमस्टैम्प से ऑर्डर करें और तीन user को इनिशियलाइज़ करें। -परिभाषित चर ।
SELECT s.* FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
जैसा कि आप देख सकते हैं, हम उसके लिए एक सबक्वायरी का उपयोग कर सकते हैं। ORDER BY
महत्वपूर्ण है, क्योंकि जब तक आप इसे निर्दिष्ट नहीं करते हैं, तब तक संबंधपरक डेटाबेस में कोई आदेश नहीं होता है।
अब, MySQL SELECT
. का मूल्यांकन करता है निर्दिष्ट क्रम में खंड, इसलिए यहां आदेश को न बदलें।
SELECT
s.*,
@prevName,
@prevStatus,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
जब आप इस कथन को निष्पादित करते हैं, तो आप देख सकते हैं कि जब हम केवल वेरिएबल का चयन करते हैं तो वे पिछली पंक्ति का मान रखते हैं या NULL जब यह पहली पंक्ति है, जिसे पढ़ा गया था। फिर वर्तमान पंक्ति का मान चरों को सौंपा गया है। तो अब हम वर्तमान पंक्ति की तुलना पिछली पंक्ति से कर सकते हैं। अगर कुछ बदल गया है, तो हम केवल तीसरे चर को बढ़ाते हैं, जो कि प्रत्येक "समूह" के लिए एक संख्या है जिसे हम बना रहे हैं।
SELECT
s.*,
@group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
इसलिए हमने @group_number
. को बढ़ा दिया जब कुछ बदल जाता है और चर को स्वयं को असाइन किया जाता है, यदि नहीं, ताकि वह परिवर्तित न हो।
अब हम इस क्वेरी को सबक्वेरी के रूप में उपयोग कर सकते हैं और एक साधारण ग्रुपिंग कर सकते हैं।
SELECT
group_number AS id,
name,
status,
MIN(error) AS error,
MIN(timestamp) AS firstEntry,
MAX(timestamp) AS lastEntry,
COUNT(*) AS entries
FROM (
SELECT
s.*,
@group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
) sq
GROUP BY
group_number,
name,
status
- इसे इस sqlfiddle में काम करते हुए देखें