Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेटा को एक नई तालिका में सारांशित करें

चरण दर चरण स्पष्टीकरण:

सबसे पहले आप टेबल को नाम और टाइमस्टैम्प से ऑर्डर करें और तीन 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 में काम करते हुए देखें



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लार्वा वाक्पटु में वर्तमान लॉग इन उपयोगकर्ता को छोड़कर सभी उपयोगकर्ताओं को प्राप्त करें

  2. PHP, MYSQL स्वत:पूर्ण काम नहीं कर रहा है

  3. MySQL रूट पासवर्ड कैसे रीसेट करें

  4. google.setOnLoadCallback() को पास किए गए फ़ंक्शन में पैरामीटर का उपयोग करें;

  5. एकाधिक चाइल्ड पंक्तियों को एक पंक्ति में संयोजित करें MYSQL