ठीक है, मुझे लगता है मैं थोड़ी देर हो चुकी हूँ, लेकिन मैं किसी भी तरह अपना जवाब पोस्ट करने के लिए :-)
क्या आप की आवश्यकता एक सबक्वेरी उपयोग किया जा सकता था, लेकिन यह एक बड़ी पर पूरा करने के लिए उम्र ले सकता है टेबल ...
प्रश्न के बारे में सोचकर मैं दो अलग-अलग दृष्टिकोणों पर आया।
उनमें से एक को पहले से ही अन्य उत्तरों में निपटाया गया है, यह समय पर एक विशिष्ट बिंदु से शुरू होता है, इस समय शुरू होने वाले अंतराल को देखता है और फिर तत्काल अवधि के अंतराल को देखता है। यह स्पष्ट, समझने योग्य परिणामों की ओर जाता है और शायद यह आवश्यक होगा (उदा। उपयोगकर्ता प्रति कैलेंडर दिन 100 डाउनलोड से अधिक नहीं होना चाहिए)। हालांकि यह उन परिस्थितियों को पूरी तरह से याद करेगा जिसमें उपयोगकर्ता मध्यरात्रि से पहले के घंटे के दौरान 99 डाउनलोड करता है और दूसरे दिन के पहले घंटे में 99 अन्य।
तो यदि आवश्यक परिणाम "शीर्ष दस डाउनलोडर्स सूची" से अधिक है, तो यह दूसरा दृष्टिकोण है। यहां के परिणाम पहली नज़र में समझ में नहीं आ सकते हैं, क्योंकि एक एकल डाउनलोड कई अंतराल की ओर गिन सकता है। ऐसा इसलिए है क्योंकि अंतराल ओवरलैप (और करने की आवश्यकता) होगा।
यहाँ मेरी सेटअप है।मैं आपके विवरण से तालिका बनाया है और एक के इंडेक्स जोड़ दिया है:
CREATE INDEX downloads_timestamp on downloads (dl_date);
CREATE INDEX downloads_user_id on downloads (user_id);
डेटा मैं तालिका में सम्मिलित किया है:
SELECT * FROM downloads;
+----+----------+---------+---------------------+
| id | stuff_id | user_id | dl_date |
+----+----------+---------+---------------------+
| 1 | 1 | 1 | 2011-01-24 09:00:00 |
| 2 | 1 | 1 | 2011-01-24 09:30:00 |
| 3 | 1 | 1 | 2011-01-24 09:35:00 |
| 4 | 1 | 1 | 2011-01-24 10:00:00 |
| 5 | 1 | 1 | 2011-01-24 11:00:00 |
| 6 | 1 | 1 | 2011-01-24 11:15:00 |
| 7 | 1 | 1 | 2011-01-25 09:15:00 |
| 8 | 1 | 1 | 2011-01-25 09:30:00 |
| 9 | 1 | 1 | 2011-01-25 09:45:00 |
| 10 | 1 | 2 | 2011-01-24 08:00:00 |
| 11 | 1 | 2 | 2011-01-24 12:00:00 |
| 12 | 1 | 2 | 2011-01-24 12:01:00 |
| 13 | 1 | 2 | 2011-01-24 12:02:00 |
| 14 | 1 | 2 | 2011-01-24 12:03:00 |
| 15 | 1 | 2 | 2011-01-24 12:00:00 |
| 16 | 1 | 2 | 2011-01-24 12:04:00 |
| 17 | 1 | 2 | 2011-01-24 12:05:00 |
| 18 | 1 | 2 | 2011-01-24 12:06:00 |
| 19 | 1 | 2 | 2011-01-24 12:07:00 |
| 20 | 1 | 2 | 2011-01-24 12:08:00 |
| 21 | 1 | 2 | 2011-01-24 12:09:00 |
| 22 | 1 | 2 | 2011-01-24 12:10:00 |
| 23 | 1 | 2 | 2011-01-25 14:00:00 |
| 24 | 1 | 2 | 2011-01-25 14:12:00 |
| 25 | 1 | 2 | 2011-01-25 14:25:00 |
+----+----------+---------+---------------------+
25 rows in set (0.00 sec)
आप देख सकते हैं, सभी डाउनलोड या तो कल या आज हुई और दो अलग-अलग उपयोगकर्ताओं द्वारा निष्पादित किया गया था।
अब, हमें क्या ध्यान रखना है निम्नलिखित है: '2011-01-24 0:00' और '2011-' के बीच 24 घंटे अंतराल (या किसी अन्य अवधि के अंतराल) की अनंत संख्या (गणितीय) है। 01-25 23:59:59 '। लेकिन जैसे-जैसे सर्वर का सटीक एक सेकंड है, यह 86,400 अंतराल करने पर निर्भर करता:
First interval: 2011-01-24 0:00:00 -> 2011-01-25 0:00:00
Second interval: 2011-01-24 0:00:01 -> 2011-01-25 0:00:01
Third interval: 2011-01-24 0:00:02 -> 2011-01-25 0:00:02
.
.
.
86400th interval: 2011-01-24 23:59:59 -> 2011-01-25 23:59:59
इसलिए हम इन सभी अंतराल से अधिक पुनरावृति और प्रति उपयोगकर्ता और प्रति अंतराल डाउनलोड की संख्या की गणना करने के एक पाश इस्तेमाल कर सकते हैं। बेशक, सभी अंतराल हमारे लिए समान रुचि नहीं रखते हैं, इसलिए हम तालिका में टाइमस्टैम्प का उपयोग करके "अंतराल की शुरुआत" के रूप में उनमें से कुछ को छोड़ सकते हैं।
यह निम्न क्वेरी करता है। यह तालिका में "अंतराल की शुरुआत" के रूप में प्रत्येक डाउनलोड टाइमस्टैम्प का उपयोग करता है, अंतराल अवधि जोड़ता है और फिर इस अंतराल के दौरान प्रति उपयोगकर्ता डाउनलोड की संख्या से पूछताछ करता है।
SET @duration = '24:00:00';
SET @limit = 5;
SELECT * FROM
(SELECT t1.user_id,
t1.dl_date startOfPeriod,
ADDTIME(t1.dl_date,@duration) endOfPeriod,
(SELECT COUNT(1)
FROM downloads t2
WHERE t1.user_id = t2.user_id
AND t1.dl_date <= t2.dl_date
AND ADDTIME(t1.dl_date,@duration) >= t2.dl_date) count
FROM downloads t1) t3
WHERE count > @limit;
यहाँ परिणाम है:
+---------+---------------------+---------------------+-------+
| user_id | startOfPeriod | endOfPeriod | count |
+---------+---------------------+---------------------+-------+
| 1 | 2011-01-24 09:00:00 | 2011-01-25 09:00:00 | 6 |
| 1 | 2011-01-24 09:30:00 | 2011-01-25 09:30:00 | 7 |
| 1 | 2011-01-24 09:35:00 | 2011-01-25 09:35:00 | 6 |
| 1 | 2011-01-24 10:00:00 | 2011-01-25 10:00:00 | 6 |
| 2 | 2011-01-24 08:00:00 | 2011-01-25 08:00:00 | 13 |
| 2 | 2011-01-24 12:00:00 | 2011-01-25 12:00:00 | 12 |
| 2 | 2011-01-24 12:01:00 | 2011-01-25 12:01:00 | 10 |
| 2 | 2011-01-24 12:02:00 | 2011-01-25 12:02:00 | 9 |
| 2 | 2011-01-24 12:03:00 | 2011-01-25 12:03:00 | 8 |
| 2 | 2011-01-24 12:00:00 | 2011-01-25 12:00:00 | 12 |
| 2 | 2011-01-24 12:04:00 | 2011-01-25 12:04:00 | 7 |
| 2 | 2011-01-24 12:05:00 | 2011-01-25 12:05:00 | 6 |
+---------+---------------------+---------------------+-------+
12 rows in set (0.00 sec)
कि क्वेरी, "अवधि की शुरुआत" के रूप में एक टाइमस्टैम्प स्वीकार "की अवधि के अंत" की गणना करने और सभी उपयोगकर्ताओं को इस अवधि में डाउनलोड की राशि को पार कर सूची चाहिए, या क्या उन सभी उपयोगकर्ताओं को सूचीबद्ध करना चाहिए जिन्होंने कभी 24 घंटों की सीमा में एक्स डाउनलोड को पार किया हो? –
@ पैट्रिक कोई शुरुआत नहीं और न ही अंत अवधि ... केवल उन सभी उपयोगकर्ताओं को सूचीबद्ध करें जो वाई में एक्स डाउनलोड को पार करते हैं (एक समय अवधि जो 24 घंटे से कुछ अलग हो सकती है) समय सीमा – eduardev
मैं एक (संभव) समाधान के बारे में सोच रहा था। यदि आप अभी भी रुचि रखते हैं, तो मैं इसे काम करूँगा और इसे यहां पोस्ट करूंगा, लेकिन इसका नकारात्मक हिस्सा होगा: कल्पना कीजिए कि मैं केवल एक घंटे में 100 डाउनलोड करता हूं, फिर कई अवधि होगी जिसमें मैं सीमा से अधिक हो जाऊंगा। पूर्व .: आज 8 और 9 बजे के बीच 100 डाउनलोड। कल सुबह 9 बजे तक 9 बजे = 100 डाउनलोड। कल सुबह 10 बजे तक 10 पूर्वाह्न = 100 डाउनलोड। कल सुबह 11 बजे तक 11 पूर्वाह्न = 100 डाउनलोड। जारी रखने के लिए ... –