[英]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.