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

MySQL में लॉगिन टाइमस्टैम्प का उपयोग करके सक्रिय उपयोगकर्ताओं की गणना करें

मैं इस तरह के एक विचार को प्रदर्शित करने जा रहा हूं जो मेरे लिए सबसे अधिक समझ में आता है और जिस तरह से मैं उत्तर दूंगा यदि प्रश्न यहां जैसा ही प्रस्तुत किया गया था:

सबसे पहले, मान लेते हैं कि एक डेटा सेट इस प्रकार है, हम टेबल को नाम देंगे 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 बार लॉगिन नहीं किया, और दिनांक कॉलम को छोड़ दिया।

इस तरह का समय लंबा हो गया, लेकिन मुझे लगता है कि यह विचारों से भरा हुआ है और मुझे लगता है कि यह निश्चित रूप से एक कार्य साक्षात्कार में दिलचस्प तरीके से उत्तर देने में मदद कर सकता है। :)

  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 का उपयोग करते समय अज्ञात स्तंभ

  2. डेटाटाइम-स्थानीय मान इनपुट टैग पर प्रकट नहीं होता है

  3. डायनेमिक टैब समान रिकॉर्ड प्रस्तुत कर रहे हैं

  4. PHP MySQL से एक्सेल स्प्रेडशीट में कनवर्ट करें कॉलम ऑटोसाइज करें

  5. मैं MySQL Connector/J . के लिए स्रोत कहां से डाउनलोड कर सकता हूं?