मैं इस तरह के एक विचार को प्रदर्शित करने जा रहा हूं जो मेरे लिए सबसे अधिक समझ में आता है और जिस तरह से मैं उत्तर दूंगा यदि प्रश्न यहां जैसा ही प्रस्तुत किया गया था:
सबसे पहले, मान लेते हैं कि एक डेटा सेट इस प्रकार है, हम टेबल को नाम देंगे logins
:
+---------+---------------------+
| user_id | login_timestamp |
+---------+---------------------+
| 1 | 2015-09-29 14:05:05 |
| 2 | 2015-09-29 14:05:08 |
| 1 | 2015-09-29 14:05:12 |
| 4 | 2015-09-22 14:05:18 |
| ... | ... |
+---------+---------------------+
अन्य कॉलम हो सकते हैं, लेकिन हमें उन पर कोई आपत्ति नहीं है।
सबसे पहले हमें उस सप्ताह की सीमाएं निर्धारित करनी चाहिए, उसके लिए हम ADDDATE()
. का उपयोग कर सकते हैं . इस विचार के साथ कि आज की तारीख-आज का सप्ताह-दिन (MySQL का DAYOFWEEK()
), रविवार की तारीख है।
उदाहरण के लिए:यदि आज बुधवार 10 तारीख है, तो Wed - 3 = Sun
, इस प्रकार 10 - 3 = 7
, और हम रविवार को 7वां होने की उम्मीद कर सकते हैं।
हम WeekStart
प्राप्त कर सकते हैं और WeekEnd
टाइमस्टैम्प इस तरह:
SELECT
DATE_FORMAT(ADDDATE(CURDATE(), INTERVAL 1-DAYOFWEEK(CURDATE()) DAY), "%Y-%m-%d 00:00:00") WeekStart,
DATE_FORMAT(ADDDATE(CURDATE(), INTERVAL 7-DAYOFWEEK(CURDATE()) DAY), "%Y-%m-%d 23:59:59") WeekEnd;
नोट:PostgreSQL में एक DATE_TRUNC()
है फ़ंक्शन जो एक निर्दिष्ट समय इकाई की शुरुआत देता है, एक तारीख दी जाती है, जैसे सप्ताह की शुरुआत, महीना, घंटा, और इसी तरह। लेकिन यह MySQL में उपलब्ध नहीं है।
इसके बाद, हमारे डेटा सेट को काटने के लिए वीकस्टार्ट और वीकएंड का उपयोग करते हैं, इस उदाहरण में मैं केवल हार्ड कोडेड तिथियों का उपयोग करके फ़िल्टर करने का तरीका दिखाऊंगा:
SELECT *
FROM `logins`
WHERE login_timestamp BETWEEN '2015-09-29 14:05:07' AND '2015-09-29 14:05:13'
यह हमारे डेटा सेट को केवल प्रासंगिक परिणामों के साथ कटा हुआ वापस करना चाहिए:
+---------+---------------------+
| user_id | login_timestamp |
+---------+---------------------+
| 2 | 2015-09-29 14:05:08 |
| 1 | 2015-09-29 14:05:12 |
+---------+---------------------+
फिर हम अपने परिणाम सेट को केवल user_id
. तक कम कर सकते हैं s, और डुप्लिकेट को फ़िल्टर करें। फिर इस तरह से गिनें:
SELECT COUNT(DISTINCT user_id)
FROM `logins`
WHERE login_timestamp BETWEEN '2015-09-29 14:05:07' AND '2015-09-29 14:05:13'
DISTINCT
डुप्लिकेट को फ़िल्टर कर देगा, और गिनती केवल राशि लौटाएगी।
संयुक्त, यह बन जाता है:
SELECT COUNT(DISTINCT user_id)
FROM `logins`
WHERE login_timestamp
BETWEEN DATE_FORMAT(ADDDATE(CURDATE(), INTERVAL 1- DAYOFWEEK(CURDATE()) DAY), "%Y-%m-%d 00:00:00")
AND DATE_FORMAT(ADDDATE(CURDATE(), INTERVAL 7- DAYOFWEEK(CURDATE()) DAY), "%Y-%m-%d 23:59:59")
बदलें CURDATE()
उस सप्ताह की उपयोगकर्ता लॉगिन गणना प्राप्त करने के लिए किसी भी टाइमस्टैम्प के साथ।
लेकिन मुझे इसे दिनों तक तोड़ने की जरूरत है, मैंने आपको रोते हुए सुना है। बेशक! और इस तरह:
सबसे पहले, आइए अपने अति-सूचनात्मक टाइमस्टैम्प का अनुवाद केवल दिनांक डेटा में करें। हम DISTINCT
add जोड़ते हैं क्योंकि हमें एक ही उपयोगकर्ता द्वारा एक ही दिन में दो बार लॉग इन करने में कोई आपत्ति नहीं है। हम उपयोगकर्ताओं की गिनती करते हैं, लॉगिन नहीं, है ना? (ध्यान दें कि हम यहां वापस कदम रखते हैं):
SELECT DISTINCT user_id, DATE_FORMAT(login_timestamp, "%Y-%m-%d")
FROM `logins`
यह पैदावार:
+---------+-----------------+
| user_id | login_timestamp |
+---------+-----------------+
| 1 | 2015-09-29 |
| 2 | 2015-09-29 |
| 4 | 2015-09-22 |
| ... | ... |
+---------+-----------------+
यह प्रश्न, हम प्रत्येक तिथि की उपस्थिति की गणना करने के लिए एक सेकंड के साथ समाप्त करेंगे:
SELECT `login_timestamp`, count(*) AS 'count'
FROM (SELECT DISTINCT user_id, DATE_FORMAT(login_timestamp, "%Y-%m-%d") AS `login_timestamp` FROM `logins`) `loginsMod`
GROUP BY `login_timestamp`
तिथि के अनुसार सूची प्राप्त करने के लिए हम गिनती और समूहीकरण का उपयोग करते हैं, जो वापस आती है:
+-----------------+-------+
| login_timestamp | count |
+-----------------+-------+
| 2015-09-29 | 1 +
| 2015-09-22 | 2 +
+-----------------+-------+
और कड़ी मेहनत के बाद दोनों एक हो गए:
SELECT `login_timestamp`, COUNT(*)
FROM (
SELECT DISTINCT user_id, DATE_FORMAT(login_timestamp, "%Y-%m-%d") AS `login_timestamp`
FROM `logins`
WHERE login_timestamp BETWEEN DATE_FORMAT(ADDDATE(CURDATE(), INTERVAL 1- DAYOFWEEK(CURDATE()) DAY), "%Y-%m-%d 00:00:00") AND DATE_FORMAT(ADDDATE(CURDATE(), INTERVAL 7- DAYOFWEEK(CURDATE()) DAY), "%Y-%m-%d 23:59:59")) `loginsMod`
GROUP BY `login_timestamp`;
आपको इस सप्ताह में प्रति दिन लॉगिन का दैनिक विश्लेषण देगा। फिर से, CURDATE()
को बदलें एक अलग सप्ताह पाने के लिए।
लॉग इन करने वाले उपयोगकर्ताओं के लिए, आइए समान सामग्री को एक अलग क्रम में संयोजित करें:
SELECT `user_id`
FROM (
SELECT `user_id`, COUNT(*) AS `login_count`
FROM (
SELECT DISTINCT `user_id`, DATE_FORMAT(`login_timestamp`, "%Y-%m-%d")
FROM `logins`) `logins`
GROUP BY `user_id`) `logincounts`
WHERE `login_count` > 6
मेरे पास दो आंतरिक प्रश्न हैं, पहला है logins
:
SELECT DISTINCT `user_id`, DATE_FORMAT(`login_timestamp`, "%Y-%m-%d")
FROM `logins`
डुप्लीकेट के बिना उपयोगकर्ताओं की सूची, और वे दिन जब वे लॉग इन करेंगे, प्रदान करेंगे।
फिर हमारे पास logincounts
. है :
SELECT `user_id`, COUNT(*) AS `login_count`
FROM `logins` -- See previous subquery.
GROUP BY `user_id`) `logincounts`
प्रत्येक उपयोगकर्ता के पास कितने लॉगिन थे, इसकी गणना के साथ एक ही सूची लौटाएगा।
और अंत में:चुनें user_id
logincounts
से -- पिछली सबक्वेरी देखें। जहां login_count
> 6पी>
हमारे उन लोगों को फ़िल्टर करना जिन्होंने 7 बार लॉगिन नहीं किया, और दिनांक कॉलम को छोड़ दिया।
इस तरह का समय लंबा हो गया, लेकिन मुझे लगता है कि यह विचारों से भरा हुआ है और मुझे लगता है कि यह निश्चित रूप से एक कार्य साक्षात्कार में दिलचस्प तरीके से उत्तर देने में मदद कर सकता है। :)पी>