अपने कार्य करने के लिए इस कोड को लागू करने की कोशिश करो -
CREATE TABLE visits(
user_id INT(11) NOT NULL,
dt DATETIME DEFAULT NULL
);
INSERT INTO visits VALUES
(1, '2011-06-30 12:11:46'),
(1, '2011-07-01 13:16:34'),
(1, '2011-07-01 15:22:45'),
(1, '2011-07-01 22:35:00'),
(1, '2011-07-02 13:45:12'),
(1, '2011-08-01 00:11:45'),
(1, '2011-08-05 17:14:34'),
(1, '2011-08-05 18:11:46'),
(1, '2011-08-06 20:22:12'),
(2, '2011-08-30 16:13:34'),
(2, '2011-08-31 16:13:41');
SET @i = 0;
SET @last_dt = NULL;
SET @last_user = NULL;
SELECT v.user_id,
COUNT(DISTINCT(DATE(dt))) number_of_days,
MAX(days) number_of_visits
FROM
(SELECT user_id, dt
@i := IF(@last_user IS NULL OR @last_user <> user_id, 1, IF(@last_dt IS NULL OR (DATE(dt) - INTERVAL 1 DAY) > DATE(@last_dt), @i + 1, @i)) AS days,
@last_dt := DATE(dt),
@last_user := user_id
FROM
visits
ORDER BY
user_id, dt
) v
GROUP BY
v.user_id;
----------------
Output:
+---------+----------------+------------------+
| user_id | number_of_days | number_of_visits |
+---------+----------------+------------------+
| 1 | 6 | 3 |
| 2 | 2 | 1 |
+---------+----------------+------------------+
स्पष्टीकरण:
को समझने के लिए कि यह कैसे की सबक्वेरी जाँच करें काम करता है, ये रहा।
SET @i = 0;
SET @last_dt = NULL;
SET @last_user = NULL;
SELECT user_id, dt,
@i := IF(@last_user IS NULL OR @last_user <> user_id, 1, IF(@last_dt IS NULL OR (DATE(dt) - INTERVAL 1 DAY) > DATE(@last_dt), @i + 1, @i)) AS
days,
@last_dt := DATE(dt) lt,
@last_user := user_id lu
FROM
visits
ORDER BY
user_id, dt;
आप क्वेरी सभी पंक्तियों वापस आती है और यात्राओं की संख्या के लिए रैंकिंग यह देखने के रूप में। यह चर के आधार पर रैंकिंग विधि ज्ञात है, ध्यान दें कि पंक्तियों का उपयोग उपयोगकर्ता और दिनांक फ़ील्ड द्वारा किया जाता है। 'COUNT (DISTINCT (DATE (:
+---------+---------------------+------+------------+----+
| user_id | dt | days | lt | lu |
+---------+---------------------+------+------------+----+
| 1 | 2011-06-30 12:11:46 | 1 | 2011-06-30 | 1 |
| 1 | 2011-07-01 13:16:34 | 1 | 2011-07-01 | 1 |
| 1 | 2011-07-01 15:22:45 | 1 | 2011-07-01 | 1 |
| 1 | 2011-07-01 22:35:00 | 1 | 2011-07-01 | 1 |
| 1 | 2011-07-02 13:45:12 | 1 | 2011-07-02 | 1 |
| 1 | 2011-08-01 00:11:45 | 2 | 2011-08-01 | 1 |
| 1 | 2011-08-05 17:14:34 | 3 | 2011-08-05 | 1 |
| 1 | 2011-08-05 18:11:46 | 3 | 2011-08-05 | 1 |
| 1 | 2011-08-06 20:22:12 | 3 | 2011-08-06 | 1 |
| 2 | 2011-08-30 16:13:34 | 1 | 2011-08-30 | 2 |
| 2 | 2011-08-31 16:13:41 | 1 | 2011-08-31 | 2 |
+---------+---------------------+------+------------+----+
फिर हम समूह इस डेटा उपयोगकर्ता द्वारा सेट और कुल कार्यों का उपयोग - डेटा सेट अगले जहां days
स्तंभ यात्राओं की संख्या के लिए रैंक प्रदान करता है यह प्रश्न उपयोगकर्ता का दौरा, और आउटपुट की गणना करता है डीटी))) '- ' MAX (days) 'की संख्या की गणना करता है - विज़िट की संख्या, यह हमारे सबक्वायरी से days
फ़ील्ड का अधिकतम मान है।
सब है;)
की Devart डेटा सेट प्रति अंतिम सही परिणाम के लिए उन्हें गिना जाता है ... मैं पूरी तरह से अपने सुझाव को समझने के लिए प्रतीत नहीं कर सकते हैं ... क्या यह संभव है कुछ और विवरण देने के लिए? धन्यवाद! दूसरे के बारे में, मेरी क्वेरी सही है, बशर्ते कि आप मेरे प्रश्न में उल्लिखित उपयोगकर्ता और शहर की गणना न करें। – linkyndy
क्षमा करें, मुझे लगता है कि "उपयोगकर्ता में कितने दिन एक शहर में हैं" के परिणाम का परिणाम दिखाना चाहिए (user_id, count_of_days)। – Simon
विवरण के लिए धन्यवाद। मेरी वास्तविक डेटाबेस तालिका में फिट करने के लिए कई समायोजनों के साथ, आपकी क्वेरी एक आकर्षण की तरह काम करती है। फिर से धन्यवाद! – linkyndy