簡體   English   中英

如何在SQL中按日期和名稱分組

[英]How to group by date and name in SQL

實際上我想要得到的很簡單,我希望每天從用戶那里獲得第一次登錄和最后一次登出。 為了得到它我有一個數據庫,我可以創建SQLQueries但我無法得到我想要的結果。 我將用這個例子來解釋它:

 (NAME-LOGIN-LOGOUT)
| AAAAAAAAAAAA       | 23/02/2012 10:33:56,323 | 23/02/2012 16:03:10,323
| AAAAAAAAAAAA       | 24/02/2012 07:59:55,787 | 24/02/2012 13:32:16,787
| AAAAAAAAAAAA       | 24/02/2012 13:34:15,823 | 24/02/2012 15:00:54,823
| AAAAAAAAAAAA       | 27/02/2012 08:00:24,283 | 27/02/2012 16:00:14,283
| AAAAAAAAAAAA       | 28/02/2012 07:56:26,78  | 28/02/2012 13:09:16,78
| AAAAAAAAAAAA       | 28/02/2012 13:09:58,287 | 28/02/2012 15:09:08,287
| AAAAAAAAAAAA       | 29/02/2012 07:52:47,82  | 29/02/2012 16:03:37,82
| AAAAAAAAAAAA       | 22/02/2012 10:15:25,817 | 22/02/2012 10:24:42,817
| BBBBBBBBBBBB       | 20/02/2012 07:22:50,31  | 24/02/2012 14:16:43,31
| CCCCCCCCCCCC       | 15/02/2012 07:58:33,777 | 15/02/2012 16:02:53,777
| CCCCCCCCCCCC       | 16/02/2012 08:00:56,29  | 16/02/2012 15:03:06,29
| CCCCCCCCCCCC       | 17/02/2012 07:57:31,29  | 17/02/2012 16:00:34,29
| CCCCCCCCCCCC       | 20/02/2012 08:01:01,82  | 20/02/2012 15:00:09,82
| CCCCCCCCCCCC       | 21/02/2012 07:59:57,29  | 21/02/2012 14:40:13,29

我希望使用具有groupby屬性的SQL sentece獲得的結果(例如對於用戶A):

(結果應該只顯示第一次登錄和當天的最后一次登出)

USER
{
    DATE
    {
      min(Login);
      max(LogOut);
    }
}



(NAME-LOGIN-LOGOUT)
AAAAAAAAAAAAA  23/02/2012 10:33:56,323   23/02/2012 16:03:10,323
AAAAAAAAAAAAA  24/02/2012 07:59:55,787   24/02/2012 15:00:54,823
AAAAAAAAAAAAA  27/02/2012 08:00:24,283   27/02/2012 16:00:14,283
AAAAAAAAAAAAA  28/02/2012 07:56:26,78    28/02/2012 15:09:08,287
.....

我想這是使用幾個選擇或條件,但我不能讓它工作。 我真的很感激任何幫助。


我想出了以下答案,但是當我組成小組時,我仍然得到最后一行的最小值和最大值。 似乎是首先獲得Group,然后獲得max和min值。 我想反過來:),首先考慮日期和用戶的最大和最小,然后按用戶和日期分組。

SELECT EnterpriseName, LoginDate, LogOutDate, min(LoginTime), max(LogOutTime)
FROM
ipcc_table
WHERE LoginDate=LogOutDate
GROUP BY  EnterpriseName,LoginDate;

最好的祝福

我希望每天從特定用戶首次登錄和注銷。

SELECT name
      ,date(login) AS day
      ,min(login)  AS login
      ,min(logout) AS logout
FROM   tbl
WHERE  name = <my_name>
GROUP  BY name, date(login)
ORDER  BY name, date(login);

date()函數應該是這里最合適的工具。

這沒有考慮到第一次登出可能在第一次登錄之前或多個會話可能交織在一起。 但你的問題確實要求這個。


如果您確實希望每天從特定用戶進行首次登錄和隨附注銷

SELECT i.name, i.day, i.login, o.logout
FROM  (
   SELECT name
         ,date(login) AS day
         ,min(login)  AS login
   FROM   tbl
   WHERE  name = <my_name>
   GROUP  BY name, date(login)
   )   i
JOIN   tbl o USING (name, login)
ORDER  BY i.name, i.login;

這假定(name, login)是唯一的。 如果不是,你真的應該添加一個代理主鍵,比如自動增量列。

你會做類似的事情

select name, min(login), min(logout), trunc(login)
group by name, trunc(login)

trunc可能是特定於oracle的,並且在一個日期中轉換(除其他外)一個帶有時間的日期。 這樣的東西也必定在你的RDBMS中可用。

SELECT name, DATE_FORMAT(login, '%d/%m/%Y') AS day, MIN(login) AS first_login, MAX(logout) AS last_logout
  FROM mytable
 GROUP BY name, day

我相信這是有效的MySQL語法,但我並不完全確定(我沒有測試平台)。 請注意,上次注銷的日期可能與登錄日期不同。

QUOTE from OP :“我希望每天首次login並從某個用戶 logout

SELECT `name`, MIN(`login`), MAX(`logout`) 
FROM table WHERE name = 'AAAA' GROUP BY YEAR(`login`), MONTH(`login`), DAY(`login`)

嘗試這個:

SELECT * FROM table GROUP BY name ORDER BY login

然后你上次登錄,如果你添加DESC,你首先登錄。

(假設DATE(login) < DATE(logout)時你想要發生什么):

    SELECT
        name
      , login
      , logout
    FROM
        tableX
    WHERE
        DATE(login) < DATE(logout)
  UNION ALL
    SELECT 
        name
      , MIN(login) 
      , MAX(logout) 
    FROM 
        tableX
    GROUP BY 
        name
      , DATE(login)
    HAVING 
        DATE(MIN(login)) = DATE(MAX(logout))

當注銷日期與登錄日期不同時,應該發生什么並不完全清楚,所以我已經補償了這兩種情況。

無論登錄日期如何,您希望每天首次登錄,以及任何一天的最后一次登出。

SELECT  Name,
        COALESCE(MIN(Login), EventDate) AS Login,
        COALESCE(MAX(LogOut), ADDTIME(EventDate, '23:59:59'))  AS LogOut
FROM    (   SELECT  Name,
                    DATE(Login) AS EventDate,
                    MIN(LogIn) AS Login,
                    NULL AS LogOut
            FROM    TestTable
            GROUP BY Name, DATE(Login)
            UNION
            SELECT  Name,
                    DATE(LogOut) AS EventDate,
                    NULL AS Login,
                    MAX(LogOut) AS LogOut
            FROM    TestTable
            GROUP BY Name, DATE(Login)
        ) AS d
GROUP BY Name, EventDate;

因此,對於上面的“BBBBBBBBBBBB”,這將返回

BBBBBBBBBBBB    2012-02-20 07:22:50  2012-02-20 23:59:59
BBBBBBBBBBBB    2012-02-24 00:00:00  2012-02-24 14:16:43

或者對於更簡單的方法:

SELECT  Name,
        MIN(Login) AS Login,
        MAX(Logout) AS LogOut
FROM    TestTable
GROUP BY Name, DATE(Login)

對於上面的'BBBBBBBBBBBB',這將返回

BBBBBBBBBBBB    2012-02-20 07:22:50   2012-02-24 14:16:43

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM