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

MySQL 8.0 में नई विश्लेषणात्मक विंडो कार्यों की समीक्षा

डेटा को कई कारणों से कैप्चर और स्टोर किया जाता है। गिनती से परे घंटे (और इससे भी अधिक बजट) डेटा के संग्रह, अंतर्ग्रहण, संरचना, सत्यापन और अंततः भंडारण में निवेश किया गया; यह कहना कि यह एक मूल्यवान संपत्ति है, घर को एक महत्वपूर्ण बिंदु पर ले जाना है। इस उम्र में, वास्तव में, यह हमारी सबसे कीमती वस्तु हो सकती है।

कुछ डेटा को संग्रह के रूप में सख्ती से उपयोग किया जाता है। शायद अतीत में हुई घटनाओं को रिकॉर्ड करने या ट्रैक करने के लिए। लेकिन उस सिक्के का दूसरा पहलू यह है कि ऐतिहासिक डेटा का भविष्य और भविष्य के प्रयासों के लिए निर्णयों को आधार बनाने में महत्व है।

  • हमारी बिक्री किस दिन होगी? (भविष्य में बिक्री की योजना इस पर आधारित है कि हमने अतीत में कैसा प्रदर्शन किया था।)
  • किस विक्रेता ने पहली तिमाही में सर्वश्रेष्ठ प्रदर्शन किया? (पीछे मुड़कर देखें, तो हम उनके प्रयासों के लिए किसे पुरस्कृत कर सकते हैं।)
  • जुलाई के मध्य में कौन सा रेस्तरां सबसे अधिक बार देखा जाता है? (यात्रा का मौसम हम पर है... हम अपने खाद्य पदार्थ और सामान किसे बेच सकते हैं?)

आपको चित्र मिल जाएगा। हाथ में डेटा का उपयोग करना किसी भी संगठन के लिए अभिन्न अंग है।

कई कंपनियां डेटा के साथ सेवाओं का निर्माण, आधार और सेवाएं प्रदान करती हैं। वे इस पर निर्भर हैं।

कई महीने पहले, जब आप इसे पढ़ रहे थे, इस पर निर्भर करते हुए, मैंने व्यायाम के लिए चलना शुरू किया, गंभीरता से, वजन कम करने के लिए, अपने स्वास्थ्य पर नियंत्रण पाने के लिए, और इस व्यस्त दुनिया से एक दैनिक एकांत की तलाश करने के लिए, जिसमें हम रहते हैं।

मैंने अपने हाइक को ट्रैक करने के लिए एक मोबाइल पेडोमीटर ऐप का इस्तेमाल किया, यहां तक ​​​​कि मैंने जो जूते पहने थे, उसे देखते हुए, क्योंकि जब जूते की बात आती है तो मेरी प्रवृत्ति अल्ट्रा-पिक्य होने की होती है।

हालांकि यह डेटा लगभग उतना महत्वपूर्ण नहीं है जितना ऊपर उन परिदृश्यों में उल्लेख किया गया है, मेरे लिए, कुछ भी सीखने में एक प्रमुख तत्व, किसी ऐसी चीज़ का उपयोग करना है जिसमें मेरी रुचि है, जिससे मैं संबंधित हो सकता हूं और समझ सकता हूं।

लंबे समय से एक्सप्लोर करने के लिए विंडो फ़ंक्शंस मेरे रडार पर हैं। इसलिए, मैंने इस पोस्ट में उनमें से कुछ पर हाथ आजमाने का सोचा। हाल ही में MySQL 8 में समर्थित होने के बाद (इस कई ब्लॉग पर जाएँ, मैंने MySQL 8 के उन्नयन और नए परिवर्धन के बारे में लिखा है जहाँ मैं उनका संक्षेप में उल्लेख करता हूँ) कि पारिस्थितिकी तंत्र वह है जिसका मैं यहाँ उपयोग करूँगा। सावधान रहें, मैं विंडो एनालिटिकल फंक्शन गुरु नहीं हूं।

MySQL विंडो फ़ंक्शन क्या है?

MySQL प्रलेखन उन्हें इस प्रकार परिभाषित करता है: "एक विंडो फ़ंक्शन क्वेरी पंक्तियों के एक सेट पर एक समग्र-जैसा ऑपरेशन करता है। हालाँकि, जबकि एक समग्र ऑपरेशन समूह पंक्तियों को एक एकल परिणाम पंक्ति में क्वेरी करता है, एक विंडो फ़ंक्शन एक परिणाम उत्पन्न करता है प्रत्येक क्वेरी पंक्ति:"

इस पोस्ट के लिए डेटा सेट और सेटअप

मैं अपने वॉक से कैप्चर किए गए डेटा को इस तालिका में संग्रहीत करता हूं:

mysql> DESC hiking_stats;
+-----------------+--------------+------+-----+---------+-------+
| Field           | Type         | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| day_walked      | date         | YES  |     | NULL    |       |
| burned_calories | decimal(4,1) | YES  |     | NULL    |       |
| distance_walked | decimal(4,2) | YES  |     | NULL    |       |
| time_walking    | time         | YES  |     | NULL    |       |
| pace            | decimal(2,1) | YES  |     | NULL    |       |
| shoes_worn      | text         | YES  |     | NULL    |       |
| trail_hiked     | text         | YES  |     | NULL    |       |
+-----------------+--------------+------+-----+---------+-------+
7 rows in set (0.01 sec)

यहां करीब 90 दिनों का डेटा है:

mysql> SELECT COUNT(*) FROM hiking_stats;
+----------+
| COUNT(*) |
+----------+
|       84 |
+----------+
1 row in set (0.00 sec)

मैं मानता हूँ, मैं अपने जूते-चप्पलों के बारे में बारीक हूँ तो आइए तय करते हैं कि मुझे किस जोड़ी के जूते सबसे ज़्यादा पसंद हैं:

mysql> SELECT DISTINCT shoes_worn, COUNT(*)
    -> FROM hiking_stats
    -> GROUP BY shoes_worn;
+---------------------------------------+----------+
| shoes_worn                            | COUNT(*) |
+---------------------------------------+----------+
| New Balance Trail Runners-All Terrain |       30 |
| Oboz Sawtooth Low                     |       47 |
| Keen Koven WP(keen-dry)               |        6 |
| New Balance 510v2                     |        1 |
+---------------------------------------+----------+
4 rows in set (0.00 sec)

एक बेहतर, प्रबंधनीय ऑन-स्क्रीन प्रदर्शन प्रदान करने के लिए, मैं क्वेरी परिणामों के शेष भाग को केवल उन पसंदीदा जूतों तक सीमित कर दूंगा जिन्हें मैंने 47 बार पहना था।

मेरे पास एक ट्रेल_हाइक्ड कॉलम भी है और चूंकि मैं 'अल्ट्रा एक्सरसाइज मोड . में था ' इस लगभग 3 महीने की अवधि के दौरान, मैंने यार्ड को धक्का देते समय कैलोरी भी गिन ली:

mysql> SELECT DISTINCT trail_hiked, COUNT(*)
    -> FROM hiking_stats
    -> GROUP BY trail_hiked;
+------------------------+----------+
| trail_hiked            | COUNT(*) |
+------------------------+----------+
| Yard Mowing            |       14 |
| Sandy Trail-Drive      |       20 |
| West Boundary          |       29 |
| House-Power Line Route |       10 |
| Tree Trail-extended    |       11 |
+------------------------+----------+
5 rows in set (0.01 sec)

फिर भी, डेटा सेट को और भी सीमित करने के लिए, मैं उन पंक्तियों को भी फ़िल्टर कर दूंगा:

mysql> SELECT COUNT(*)
    -> FROM hiking_stats
    -> WHERE shoes_worn = 'Oboz Sawtooth Low'
    -> AND
    -> trail_hiked <> 'Yard Mowing';
+----------+
| COUNT(*) |
+----------+
|       40 |
+----------+
1 row in set (0.01 sec)

सादगी और उपयोग में आसानी के लिए, मैं इसके साथ काम करने के लिए स्तंभों का एक दृश्य बनाऊंगा:

mysql> CREATE VIEW vw_fav_shoe_stats AS
    -> (SELECT day_walked, burned_calories, distance_walked, time_walking, pace, trail_hiked
    -> FROM hiking_stats
    -> WHERE shoes_worn = 'Oboz Sawtooth Low'
    -> AND trail_hiked <> 'Yard Mowing');
Query OK, 0 rows affected (0.19 sec)

मुझे डेटा के इस सेट के साथ छोड़कर:

mysql> SELECT * FROM vw_fav_shoe_stats;
+------------+-----------------+-----------------+--------------+------+------------------------+
| day_walked | burned_calories | distance_walked | time_walking | pace | trail_hiked            |
+------------+-----------------+-----------------+--------------+------+------------------------+
| 2018-06-03 |           389.6 |            4.11 | 01:13:19     |  3.4 | Sandy Trail-Drive      |
| 2018-06-04 |           394.6 |            4.26 | 01:14:15     |  3.4 | Sandy Trail-Drive      |
| 2018-06-06 |           384.6 |            4.10 | 01:13:14     |  3.4 | Sandy Trail-Drive      |
| 2018-06-07 |           382.7 |            4.12 | 01:12:52     |  3.4 | Sandy Trail-Drive      |
| 2018-06-17 |           296.3 |            2.82 | 00:55:45     |  3.0 | West Boundary          |
| 2018-06-18 |           314.7 |            3.08 | 00:59:13     |  3.1 | West Boundary          |
| 2018-06-20 |           338.5 |            3.27 | 01:03:42     |  3.1 | West Boundary          |
| 2018-06-21 |           339.5 |            3.40 | 01:03:54     |  3.2 | West Boundary          |
| 2018-06-24 |           392.4 |            3.76 | 01:13:51     |  3.1 | House-Power Line Route |
| 2018-06-25 |           362.1 |            3.72 | 01:08:09     |  3.3 | West Boundary          |
| 2018-06-26 |           380.5 |            3.94 | 01:11:36     |  3.3 | West Boundary          |
| 2018-07-03 |           323.7 |            3.29 | 01:00:55     |  3.2 | West Boundary          |
| 2018-07-04 |           342.8 |            3.47 | 01:04:31     |  3.2 | West Boundary          |
| 2018-07-06 |           375.7 |            3.80 | 01:10:42     |  3.2 | West Boundary          |
| 2018-07-07 |           347.6 |            3.40 | 01:05:25     |  3.1 | Sandy Trail-Drive      |
| 2018-07-08 |           351.6 |            3.58 | 01:06:09     |  3.2 | West Boundary          |
| 2018-07-09 |           336.0 |            3.28 | 01:03:13     |  3.1 | West Boundary          |
| 2018-07-11 |           375.2 |            3.81 | 01:10:37     |  3.2 | West Boundary          |
| 2018-07-12 |           325.9 |            3.28 | 01:01:20     |  3.2 | West Boundary          |
| 2018-07-15 |           382.9 |            3.91 | 01:12:03     |  3.3 | House-Power Line Route |
| 2018-07-16 |           368.6 |            3.72 | 01:09:22     |  3.2 | West Boundary          |
| 2018-07-17 |           339.4 |            3.46 | 01:03:52     |  3.3 | West Boundary          |
| 2018-07-18 |           368.1 |            3.72 | 01:08:28     |  3.3 | West Boundary          |
| 2018-07-19 |           339.2 |            3.44 | 01:03:06     |  3.3 | West Boundary          |
| 2018-07-22 |           378.3 |            3.76 | 01:10:22     |  3.2 | West Boundary          |
| 2018-07-23 |           322.9 |            3.28 | 01:00:03     |  3.3 | West Boundary          |
| 2018-07-24 |           386.4 |            3.81 | 01:11:53     |  3.2 | West Boundary          |
| 2018-07-25 |           379.9 |            3.83 | 01:10:39     |  3.3 | West Boundary          |
| 2018-07-27 |           378.3 |            3.73 | 01:10:21     |  3.2 | West Boundary          |
| 2018-07-28 |           337.4 |            3.39 | 01:02:45     |  3.2 | Sandy Trail-Drive      |
| 2018-07-29 |           348.7 |            3.50 | 01:04:52     |  3.2 | West Boundary          |
| 2018-07-30 |           361.6 |            3.69 | 01:07:15     |  3.3 | West Boundary          |
| 2018-07-31 |           359.9 |            3.66 | 01:06:57     |  3.3 | West Boundary          |
| 2018-08-01 |           336.1 |            3.37 | 01:01:48     |  3.3 | West Boundary          |
| 2018-08-03 |           259.9 |            2.57 | 00:47:47     |  3.2 | West Boundary          |
| 2018-08-05 |           341.2 |            3.37 | 01:02:44     |  3.2 | West Boundary          |
| 2018-08-06 |           357.7 |            3.64 | 01:05:46     |  3.3 | West Boundary          |
| 2018-08-17 |           184.2 |            1.89 | 00:39:00     |  2.9 | Tree Trail-extended    |
| 2018-08-18 |           242.9 |            2.53 | 00:51:25     |  3.0 | Tree Trail-extended    |
| 2018-08-30 |           204.4 |            1.95 | 00:37:35     |  3.1 | House-Power Line Route |
+------------+-----------------+-----------------+--------------+------+------------------------+
40 rows in set (0.00 sec)

पहला विंडो फ़ंक्शन जो मैं देखूंगा वह है ROW_NUMBER()।

मान लीजिए कि मुझे 'जुलाई' महीने के लिए burn_कैलोरी कॉलम द्वारा ऑर्डर किया गया परिणाम सेट चाहिए।

बेशक, मैं इस क्वेरी के साथ उस डेटा को पुनः प्राप्त कर सकता हूं:

mysql> SELECT day_walked, burned_calories, trail_hiked
    -> FROM vw_fav_shoe_stats
    -> WHERE MONTHNAME(day_walked) = 'July'
    -> ORDER BY burned_calories DESC;
+------------+-----------------+------------------------+
| day_walked | burned_calories | trail_hiked            |
+------------+-----------------+------------------------+
| 2018-07-24 |           386.4 | West Boundary          |
| 2018-07-15 |           382.9 | House-Power Line Route |
| 2018-07-25 |           379.9 | West Boundary          |
| 2018-07-22 |           378.3 | West Boundary          |
| 2018-07-27 |           378.3 | West Boundary          |
| 2018-07-06 |           375.7 | West Boundary          |
| 2018-07-11 |           375.2 | West Boundary          |
| 2018-07-16 |           368.6 | West Boundary          |
| 2018-07-18 |           368.1 | West Boundary          |
| 2018-07-30 |           361.6 | West Boundary          |
| 2018-07-31 |           359.9 | West Boundary          |
| 2018-07-08 |           351.6 | West Boundary          |
| 2018-07-29 |           348.7 | West Boundary          |
| 2018-07-07 |           347.6 | Sandy Trail-Drive      |
| 2018-07-04 |           342.8 | West Boundary          |
| 2018-07-17 |           339.4 | West Boundary          |
| 2018-07-19 |           339.2 | West Boundary          |
| 2018-07-28 |           337.4 | Sandy Trail-Drive      |
| 2018-07-09 |           336.0 | West Boundary          |
| 2018-07-12 |           325.9 | West Boundary          |
| 2018-07-03 |           323.7 | West Boundary          |
| 2018-07-23 |           322.9 | West Boundary          |
+------------+-----------------+------------------------+
22 rows in set (0.01 sec)

फिर भी, किसी भी कारण से (शायद व्यक्तिगत संतुष्टि), मैं पुरस्कार . चाहता हूं एक रैंकिंग लौटाई गई पंक्तियों में से 1 से शुरू होकर बर्न_कैलोरी की उच्चतम संख्या का संकेत मिलता है, परिणाम सेट में (n) पंक्तियों तक।

ROW_NUMBER(), इसे बिना किसी समस्या के संभाल सकता है:

mysql> SELECT day_walked, burned_calories,
    -> ROW_NUMBER() OVER(ORDER BY burned_calories DESC)
    -> AS position, trail_hiked
    -> FROM vw_fav_shoe_stats
    -> WHERE MONTHNAME(day_walked) = 'July';
+------------+-----------------+----------+------------------------+
| day_walked | burned_calories | position | trail_hiked            |
+------------+-----------------+----------+------------------------+
| 2018-07-24 |           386.4 |        1 | West Boundary          |
| 2018-07-15 |           382.9 |        2 | House-Power Line Route |
| 2018-07-25 |           379.9 |        3 | West Boundary          |
| 2018-07-22 |           378.3 |        4 | West Boundary          |
| 2018-07-27 |           378.3 |        5 | West Boundary          |
| 2018-07-06 |           375.7 |        6 | West Boundary          |
| 2018-07-11 |           375.2 |        7 | West Boundary          |
| 2018-07-16 |           368.6 |        8 | West Boundary          |
| 2018-07-18 |           368.1 |        9 | West Boundary          |
| 2018-07-30 |           361.6 |       10 | West Boundary          |
| 2018-07-31 |           359.9 |       11 | West Boundary          |
| 2018-07-08 |           351.6 |       12 | West Boundary          |
| 2018-07-29 |           348.7 |       13 | West Boundary          |
| 2018-07-07 |           347.6 |       14 | Sandy Trail-Drive      |
| 2018-07-04 |           342.8 |       15 | West Boundary          |
| 2018-07-17 |           339.4 |       16 | West Boundary          |
| 2018-07-19 |           339.2 |       17 | West Boundary          |
| 2018-07-28 |           337.4 |       18 | Sandy Trail-Drive      |
| 2018-07-09 |           336.0 |       19 | West Boundary          |
| 2018-07-12 |           325.9 |       20 | West Boundary          |
| 2018-07-03 |           323.7 |       21 | West Boundary          |
| 2018-07-23 |           322.9 |       22 | West Boundary          |
+------------+-----------------+----------+------------------------+
22 rows in set (0.00 sec)

आप देख सकते हैं कि 386.4 की बर्न_कैलोरी वाली पंक्ति में स्थिति . है 1, जबकि 322.9 मान वाली पंक्ति में 22 है, जो कि लौटाई गई पंक्तियों में सबसे कम (या सबसे कम) राशि है।

जैसे-जैसे हम आगे बढ़ेंगे, मैं कुछ और दिलचस्प चीज़ों के लिए ROW_NUMBER() का उपयोग करूँगा। जब मैंने इसके बारे में उस संदर्भ में उपयोग किए जाने के बारे में सीखा, तो क्या मुझे वास्तव में इसकी कुछ वास्तविक शक्ति का एहसास हुआ।

आगे, आइए एक भिन्न प्रकार की 'रैंकिंग' प्रदान करने के लिए RANK() विंडो फ़ंक्शन पर जाएँ 'पंक्तियों के बीच। हम अभी भी burn_कैलोरी कॉलम मान को लक्षित करेंगे। और, जबकि RANK() ROW_NUMBER() के समान है, जिसमें वे कुछ हद तक पंक्तियों को रैंक करते हैं, यह कुछ परिस्थितियों में एक सूक्ष्म अंतर पेश करता है।

मैं 'जुलाई' के महीने में नहीं बल्कि एक विशिष्ट निशान को लक्षित करके किसी भी रिकॉर्ड को फ़िल्टर करके पंक्तियों की संख्या को समग्र रूप से सीमित कर दूंगा:

mysql> SELECT day_walked, burned_calories,
    -> RANK() OVER(ORDER BY burned_calories DESC) AS position,
    -> trail_hiked
    -> FROM vw_fav_shoe_stats
    -> WHERE MONTHNAME(day_walked) = 'July'
    -> AND trail_hiked = 'West Boundary';
+------------+-----------------+----------+---------------+
| day_walked | burned_calories | position | trail_hiked   |
+------------+-----------------+----------+---------------+
| 2018-07-24 |           386.4 |        1 | West Boundary |
| 2018-07-25 |           379.9 |        2 | West Boundary |
| 2018-07-22 |           378.3 |        3 | West Boundary |
| 2018-07-27 |           378.3 |        3 | West Boundary |
| 2018-07-06 |           375.7 |        5 | West Boundary |
| 2018-07-11 |           375.2 |        6 | West Boundary |
| 2018-07-16 |           368.6 |        7 | West Boundary |
| 2018-07-18 |           368.1 |        8 | West Boundary |
| 2018-07-30 |           361.6 |        9 | West Boundary |
| 2018-07-31 |           359.9 |       10 | West Boundary |
| 2018-07-08 |           351.6 |       11 | West Boundary |
| 2018-07-29 |           348.7 |       12 | West Boundary |
| 2018-07-04 |           342.8 |       13 | West Boundary |
| 2018-07-17 |           339.4 |       14 | West Boundary |
| 2018-07-19 |           339.2 |       15 | West Boundary |
| 2018-07-09 |           336.0 |       16 | West Boundary |
| 2018-07-12 |           325.9 |       17 | West Boundary |
| 2018-07-03 |           323.7 |       18 | West Boundary |
| 2018-07-23 |           322.9 |       19 | West Boundary |
+------------+-----------------+----------+---------------+
19 rows in set (0.01 sec)

यहाँ कुछ भी अजीब नोटिस? ROW_NUMBER() से अलग?

'2018-07-22' और '2018-07-27' की उन पंक्तियों के लिए स्थिति मान देखें। वे तीसरे स्थान पर हैं।

अच्छे कारण के साथ क्योंकि बर्न_कैलोरी का मान 378.3 दोनों पंक्तियों में मौजूद है।

ROW_NUMBER() उन्हें कैसे रैंक करेगा?

आइए जानें:

mysql> SELECT day_walked, burned_calories,
    -> ROW_NUMBER() OVER(ORDER BY burned_calories DESC) AS position,
    -> trail_hiked
    -> FROM vw_fav_shoe_stats
    -> WHERE MONTHNAME(day_walked) = 'July'
    -> AND trail_hiked = 'West Boundary';
+------------+-----------------+----------+---------------+
| day_walked | burned_calories | position | trail_hiked   |
+------------+-----------------+----------+---------------+
| 2018-07-24 |           386.4 |        1 | West Boundary |
| 2018-07-25 |           379.9 |        2 | West Boundary |
| 2018-07-22 |           378.3 |        3 | West Boundary |
| 2018-07-27 |           378.3 |        4 | West Boundary |
| 2018-07-06 |           375.7 |        5 | West Boundary |
| 2018-07-11 |           375.2 |        6 | West Boundary |
| 2018-07-16 |           368.6 |        7 | West Boundary |
| 2018-07-18 |           368.1 |        8 | West Boundary |
| 2018-07-30 |           361.6 |        9 | West Boundary |
| 2018-07-31 |           359.9 |       10 | West Boundary |
| 2018-07-08 |           351.6 |       11 | West Boundary |
| 2018-07-29 |           348.7 |       12 | West Boundary |
| 2018-07-04 |           342.8 |       13 | West Boundary |
| 2018-07-17 |           339.4 |       14 | West Boundary |
| 2018-07-19 |           339.2 |       15 | West Boundary |
| 2018-07-09 |           336.0 |       16 | West Boundary |
| 2018-07-12 |           325.9 |       17 | West Boundary |
| 2018-07-03 |           323.7 |       18 | West Boundary |
| 2018-07-23 |           322.9 |       19 | West Boundary |
+------------+-----------------+----------+---------------+
19 rows in set (0.06 sec)

हम्म...

इस बार पोजीशन कॉलम नंबरिंग में कोई टाई नहीं है।

लेकिन, वरीयता किसे मिलती है?

मेरी जानकारी के लिए, एक पूर्वानुमानित आदेश के लिए, आपको इसे क्वेरी के भीतर किसी अन्य अतिरिक्त माध्यम से निर्धारित करना होगा (उदाहरण के लिए इस मामले में टाइम_वॉकिंग कॉलम?)।

लेकिन हमने अभी तक रैंकिंग विकल्पों के साथ काम नहीं किया है। यहाँ है DENSE_RANK():

mysql> SELECT day_walked, burned_calories,
    -> DENSE_RANK() OVER(ORDER BY burned_calories DESC) AS position,
    -> trail_hiked
    -> FROM vw_fav_shoe_stats
    -> WHERE MONTHNAME(day_walked) = 'July'
    -> AND trail_hiked = 'West Boundary';
+------------+-----------------+----------+---------------+
| day_walked | burned_calories | position | trail_hiked   |
+------------+-----------------+----------+---------------+
| 2018-07-24 |           386.4 |        1 | West Boundary |
| 2018-07-25 |           379.9 |        2 | West Boundary |
| 2018-07-22 |           378.3 |        3 | West Boundary |
| 2018-07-27 |           378.3 |        3 | West Boundary |
| 2018-07-06 |           375.7 |        4 | West Boundary |
| 2018-07-11 |           375.2 |        5 | West Boundary |
| 2018-07-16 |           368.6 |        6 | West Boundary |
| 2018-07-18 |           368.1 |        7 | West Boundary |
| 2018-07-30 |           361.6 |        8 | West Boundary |
| 2018-07-31 |           359.9 |        9 | West Boundary |
| 2018-07-08 |           351.6 |       10 | West Boundary |
| 2018-07-29 |           348.7 |       11 | West Boundary |
| 2018-07-04 |           342.8 |       12 | West Boundary |
| 2018-07-17 |           339.4 |       13 | West Boundary |
| 2018-07-19 |           339.2 |       14 | West Boundary |
| 2018-07-09 |           336.0 |       15 | West Boundary |
| 2018-07-12 |           325.9 |       16 | West Boundary |
| 2018-07-03 |           323.7 |       17 | West Boundary |
| 2018-07-23 |           322.9 |       18 | West Boundary |
+------------+-----------------+----------+---------------+
19 rows in set (0.00 sec)

टाई बनी हुई है, हालांकि, जहां पंक्तियों को गिना जाता है . में नंबरिंग अलग है , शेष परिणामों के माध्यम से जारी है।

जहां RANK () ने टाई के बाद 5 के साथ गिनती शुरू की, DENSE_RANK () अगले नंबर पर पिक करता है, जो इस उदाहरण में 4 है, क्योंकि टाई पंक्ति 3 पर हुई थी।

मैं यह स्वीकार करने वाला पहला व्यक्ति होगा, ये विभिन्न पंक्ति रैंकिंग पैटर्न काफी दिलचस्प हैं, लेकिन, सार्थक परिणाम सेट के लिए आप उनका उपयोग कैसे कर सकते हैं?

आपके संपूर्ण डेटाबेस इन्फ्रास्ट्रक्चर के लिए ClusterControlSingle कंसोल पता करें कि ClusterControl में और क्या नया है, ClusterControl को निःशुल्क स्थापित करें

एक बोनस विचार

मुझे क्रेडिट देना होगा जहां क्रेडिट देय है। मैंने YouTube पर एक अद्भुत श्रृंखला से विंडो फ़ंक्शंस के बारे में बहुत कुछ सीखा और एक वीडियो ने, विशेष रूप से, मुझे इस अगले उदाहरण के लिए प्रेरित किया। कृपया ध्यान रखें, हालांकि उस श्रृंखला के उदाहरणों को गैर-ओपन-सोर्स डेटाबेस . के साथ प्रदर्शित किया जाता है प्रणाली (मुझ पर डिजिटल सड़े हुए फलों और सब्जियों को टॉस न करें), कुल मिलाकर वीडियो से सीखने के लिए बहुत कुछ है।

मैं अब तक के अधिकांश क्वेरी परिणामों में एक पैटर्न देखता हूं जिसे मैं एक्सप्लोर करना चाहता हूं। मैं किसी भी महीने और न ही निशान से फ़िल्टर करूँगा।

मैं जो जानना चाहता हूं, वे लगातार ऐसे दिन हैं जब मैंने 350 से अधिक कैलोरी बर्न की। बेहतर अभी तक, उन दिनों के समूह।

यहां मूल क्वेरी है जिसके साथ मैं शुरू करूंगा और इससे निर्माण करूंगा:

mysql> SELECT day_walked, burned_calories, 
    -> ROW_NUMBER() OVER(ORDER BY day_walked ASC) AS positional_bound, 
    -> trail_hiked 
    -> FROM vw_fav_shoe_stats 
    -> WHERE burned_calories > 350;
+------------+-----------------+------------------+------------------------+
| day_walked | burned_calories | positional_bound | trail_hiked            |
+------------+-----------------+------------------+------------------------+
| 2018-06-03 |           389.6 |                1 | Sandy Trail-Drive      |
| 2018-06-04 |           394.6 |                2 | Sandy Trail-Drive      |
| 2018-06-06 |           384.6 |                3 | Sandy Trail-Drive      |
| 2018-06-07 |           382.7 |                4 | Sandy Trail-Drive      |
| 2018-06-24 |           392.4 |                5 | House-Power Line Route |
| 2018-06-25 |           362.1 |                6 | West Boundary          |
| 2018-06-26 |           380.5 |                7 | West Boundary          |
| 2018-07-06 |           375.7 |                8 | West Boundary          |
| 2018-07-08 |           351.6 |                9 | West Boundary          |
| 2018-07-11 |           375.2 |               10 | West Boundary          |
| 2018-07-15 |           382.9 |               11 | House-Power Line Route |
| 2018-07-16 |           368.6 |               12 | West Boundary          |
| 2018-07-18 |           368.1 |               13 | West Boundary          |
| 2018-07-22 |           378.3 |               14 | West Boundary          |
| 2018-07-24 |           386.4 |               15 | West Boundary          |
| 2018-07-25 |           379.9 |               16 | West Boundary          |
| 2018-07-27 |           378.3 |               17 | West Boundary          |
| 2018-07-30 |           361.6 |               18 | West Boundary          |
| 2018-07-31 |           359.9 |               19 | West Boundary          |
| 2018-08-06 |           357.7 |               20 | West Boundary          |
+------------+-----------------+------------------+------------------------+
20 rows in set (0.00 sec)

हमने ROW_NUMBER() पहले ही देख लिया है, हालांकि अब यह वास्तव में चलन में आ गया है।

इस काम को करने के लिए (कम से कम MySQL में) मुझे अनिवार्य रूप से DATE_SUB() फ़ंक्शन का उपयोग करना पड़ा, इस तकनीक के साथ हम एक संख्या घटा रहे हैं - ROW_NUMBER() द्वारा प्रदान किया गया मान उसी पंक्ति के day_walked दिनांक कॉलम से, जिसमें बारी, गणना के माध्यम से ही एक तिथि प्रदान करता है:

mysql> SELECT day_walked AS day_of_walk,
    -> DATE_SUB(day_walked, INTERVAL ROW_NUMBER() OVER(ORDER BY day_walked ASC) DAY) AS positional_bound,
    -> burned_calories,
    -> trail_hiked
    -> FROM vw_fav_shoe_stats
    -> WHERE burned_calories > 350;
+-------------+------------------+-----------------+------------------------+
| day_of_walk | positional_bound | burned_calories | trail_hiked            |
+-------------+------------------+-----------------+------------------------+
| 2018-06-03  | 2018-06-02       |           389.6 | Sandy Trail-Drive      |
| 2018-06-04  | 2018-06-02       |           394.6 | Sandy Trail-Drive      |
| 2018-06-06  | 2018-06-03       |           384.6 | Sandy Trail-Drive      |
| 2018-06-07  | 2018-06-03       |           382.7 | Sandy Trail-Drive      |
| 2018-06-24  | 2018-06-19       |           392.4 | House-Power Line Route |
| 2018-06-25  | 2018-06-19       |           362.1 | West Boundary          |
| 2018-06-26  | 2018-06-19       |           380.5 | West Boundary          |
| 2018-07-06  | 2018-06-28       |           375.7 | West Boundary          |
| 2018-07-08  | 2018-06-29       |           351.6 | West Boundary          |
| 2018-07-11  | 2018-07-01       |           375.2 | West Boundary          |
| 2018-07-15  | 2018-07-04       |           382.9 | House-Power Line Route |
| 2018-07-16  | 2018-07-04       |           368.6 | West Boundary          |
| 2018-07-18  | 2018-07-05       |           368.1 | West Boundary          |
| 2018-07-22  | 2018-07-08       |           378.3 | West Boundary          |
| 2018-07-24  | 2018-07-09       |           386.4 | West Boundary          |
| 2018-07-25  | 2018-07-09       |           379.9 | West Boundary          |
| 2018-07-27  | 2018-07-10       |           378.3 | West Boundary          |
| 2018-07-30  | 2018-07-12       |           361.6 | West Boundary          |
| 2018-07-31  | 2018-07-12       |           359.9 | West Boundary          |
| 2018-08-06  | 2018-07-17       |           357.7 | West Boundary          |
+-------------+------------------+-----------------+------------------------+
20 rows in set (0.00 sec)

हालांकि, DATE_SUB() के बिना, आप इसके साथ समाप्त हो जाते हैं (या कम से कम मैंने किया):

mysql> SELECT day_walked AS day_of_walk,
    -> day_walked - ROW_NUMBER() OVER(ORDER BY day_walked ASC) AS positional_bound,
    -> burned_calories,
    -> trail_hiked
    -> FROM vw_fav_shoe_stats
    -> WHERE burned_calories > 350;
+-------------+------------------+-----------------+------------------------+
| day_of_walk | positional_bound | burned_calories | trail_hiked            |
+-------------+------------------+-----------------+------------------------+
| 2018-06-03  |         20180602 |           389.6 | Sandy Trail-Drive      |
| 2018-06-04  |         20180602 |           394.6 | Sandy Trail-Drive      |
| 2018-06-06  |         20180603 |           384.6 | Sandy Trail-Drive      |
| 2018-06-07  |         20180603 |           382.7 | Sandy Trail-Drive      |
| 2018-06-24  |         20180619 |           392.4 | House-Power Line Route |
| 2018-06-25  |         20180619 |           362.1 | West Boundary          |
| 2018-06-26  |         20180619 |           380.5 | West Boundary          |
| 2018-07-06  |         20180698 |           375.7 | West Boundary          |
| 2018-07-08  |         20180699 |           351.6 | West Boundary          |
| 2018-07-11  |         20180701 |           375.2 | West Boundary          |
| 2018-07-15  |         20180704 |           382.9 | House-Power Line Route |
| 2018-07-16  |         20180704 |           368.6 | West Boundary          |
| 2018-07-18  |         20180705 |           368.1 | West Boundary          |
| 2018-07-22  |         20180708 |           378.3 | West Boundary          |
| 2018-07-24  |         20180709 |           386.4 | West Boundary          |
| 2018-07-25  |         20180709 |           379.9 | West Boundary          |
| 2018-07-27  |         20180710 |           378.3 | West Boundary          |
| 2018-07-30  |         20180712 |           361.6 | West Boundary          |
| 2018-07-31  |         20180712 |           359.9 | West Boundary          |
| 2018-08-06  |         20180786 |           357.7 | West Boundary          |
+-------------+------------------+-----------------+------------------------+
20 rows in set (0.04 sec)

अरे, यह वास्तव में इतना बुरा नहीं लगता।

क्या देता है?

एह, '20180698' के स्थितिगत_बाउंड मान वाली पंक्ति...

एक मिनट रुकिए, यह दिन_ऑफ_वॉक कॉलम से ROW_NUMBER() प्रदान की गई संख्या को घटाकर दिनांक मान की गणना करने वाला है।

सही।

मैं आपके बारे में नहीं जानता, लेकिन मुझे 98 दिनों वाले महीने का पता नहीं है!

लेकिन, अगर कोई है, तो अतिरिक्त तनख्वाह लाएँ!

सभी मज़ा एक तरफ, यह स्पष्ट रूप से गलत था और मुझे (अंततः) DATE_SUB() का उपयोग करने के लिए प्रेरित किया, जो एक सही, परिणाम सेट प्रदान करता है और फिर मुझे इस क्वेरी को चलाने की इजाजत देता है:

mysql> SELECT MIN(t.day_of_walk), 
    -> MAX(t.day_of_walk),
    -> COUNT(*) AS num_of_hikes
    -> FROM (SELECT day_walked AS day_of_walk,
    -> DATE_SUB(day_walked, INTERVAL ROW_NUMBER() OVER(ORDER BY day_walked ASC) DAY) AS positional_bound
    -> FROM vw_fav_shoe_stats
    -> WHERE burned_calories > 350) AS t
    -> GROUP BY t.positional_bound
    -> ORDER BY 1;
+--------------------+--------------------+--------------+
| MIN(t.day_of_walk) | MAX(t.day_of_walk) | num_of_hikes |
+--------------------+--------------------+--------------+
| 2018-06-03         | 2018-06-04         |            2 |
| 2018-06-06         | 2018-06-07         |            2 |
| 2018-06-24         | 2018-06-26         |            3 |
| 2018-07-06         | 2018-07-06         |            1 |
| 2018-07-08         | 2018-07-08         |            1 |
| 2018-07-11         | 2018-07-11         |            1 |
| 2018-07-15         | 2018-07-16         |            2 |
| 2018-07-18         | 2018-07-18         |            1 |
| 2018-07-22         | 2018-07-22         |            1 |
| 2018-07-24         | 2018-07-25         |            2 |
| 2018-07-27         | 2018-07-27         |            1 |
| 2018-07-30         | 2018-07-31         |            2 |
| 2018-08-06         | 2018-08-06         |            1 |
+--------------------+--------------------+--------------+
13 rows in set (0.12 sec)
2018 में MySQL MySQL के लिए संबंधित संसाधन ClusterControl:8.0 और अन्य टिप्पणियों में क्या है MySQL प्रदर्शन बेंचमार्किंग:MySQL 5.7 बनाम MySQL 8.0

मूल रूप से, मैंने लिपटे एक व्युत्पन्न तालिका के रूप में उस विश्लेषणात्मक क्वेरी से प्रदान किए गए परिणाम सेट, और इसके लिए पूछताछ की:एक प्रारंभ और समाप्ति तिथि, जो मैंने num_of_hikes लेबल किया है, उसकी गिनती, फिर स्थितिगत_बाउंड कॉलम पर समूहीकृत, अंततः समूहों के सेट प्रदान करना लगातार दिन जहां मैंने 350 से अधिक कैलोरी बर्न की।

आप 2018-06-24 से 2018-06-26 की तारीख सीमा में देख सकते हैं, जिसके परिणामस्वरूप लगातार 3 दिनों तक WHERE क्लॉज में 350 के कैलोरी बर्न मानदंड को पूरा किया गया।

बहुत बुरा नहीं है अगर मैं खुद ऐसा नहीं कहता, लेकिन निश्चित रूप से एक रिकॉर्ड जिसे मैं कोशिश करना चाहता हूं और सर्वश्रेष्ठ!

निष्कर्ष

विंडो फ़ंक्शंस एक दुनिया में हैं और अपनी खुद की लीग हैं। मैंने उनमें से केवल 3 को ही 'उच्च-स्तरीय' में कवर करने के बाद, उनकी सतह को खरोंच तक नहीं किया है ' परिचयात्मक और शायद, तुच्छ अर्थ। हालांकि, उम्मीद है, इस पोस्ट के माध्यम से, आप पाएंगे कि आप 'न्यूनतम के साथ काफी दिलचस्प और संभावित रूप से व्यावहारिक डेटा के लिए क्वेरी कर सकते हैं। ' उनका उपयोग करें।

पढ़ने के लिए धन्यवाद।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL/MariaDB में एक डेटाबेस को कैसे डिलीट करें

  2. MySQL में कॉलम के डेटा प्रकार की जांच करने के 4 तरीके

  3. MySQL में INDEX, PRIMARY, UNIQUE, FULLTEXT के बीच अंतर?

  4. लाइक और वाइल्डकार्ड का उपयोग करके MySQL खोज का अनुकूलन

  5. .frm फ़ाइलों से mysql डेटाबेस को पुनर्स्थापित करें