繁体   English   中英

选择将相同的列按日期分组到不同的列中

[英]select group same column by date into different column

我有一个登录表,如下所示:

Created                |  Action
20/01/2016 08:00:00 AM    login
20/01/2016 10:05:10 AM    logout
20/01/2016 12:00:00 PM    login
20/01/2016 04:12:22 PM    logout
21/01/2016 08:00:50 AM    login
21/01/2016 09:44:42 AM    login
21/01/2016 10:44:42 AM    login
21/01/2016 04:00:42 PM    logout

我需要选择一个如下所示的结果集:

Created        |    Login   |    Logout        
20/01/2016      08:00:00 AM   04:12:22 PM
21/01/2016      08:00:50 PM   04:00:42 PM

这是我尝试过的:

SELECT
    CONVERT(VARCHAR(10),li.Created,10) [Date],
    CONVERT(VARCHAR(8),MAX(li.Created),8) [Login],
    CONVERT(VARCHAR(8),MAX(lo.Created),8) [Logout]
FROM Logins li
LEFT JOIN Logins lo ON lo.[Action] = 'logout'
GROUP BY li.Created

但结果没有按日期分组。

什么是正确的方法?

你可以尝试这样:

SELECT 
CONVERT(VARCHAR(10),li.Created,10) [Date], 
CONVERT(VARCHAR(8),MAX(li.Created),8) [Login],
CONVERT(VARCHAR(8),MAX(lo.Created),8) [Logout] 
From Logins li 
Left Join Logins lo  on lo.[Action] = 'logout' 
GROUP BY CAST(li.Created AS DATE)

也就是说,您需要按日期分组记录,而不是按日期和时间分组。

我将假设你的结果中20日凌晨4点注销是一个疏忽,否则我们需要知道确定它应被视为当天注销时间的逻辑。

一个问题是,您尝试仅显示日期作为您的组,但您按日期和时间进行分组。

试试这个:

SELECT
    CAST(LI.created AS DATE) AS created,
    MIN(CAST(LI.created AS TIME)) AS login,
    MAX(CAST(LO.created AS TIME)) AS logout
FROM
    dbo.My_Table LI
LEFT OUTER JOIN dbo.My_Table LO ON
    LO.action = 'logout' AND
    CAST(LO.created AS DATE) = CAST(LI.created AS DATE)
WHERE
    LI.action = 'login'
GROUP BY
    CAST(LI.created AS DATE)

另一件需要考虑的事情是登录期是否可以跨越日期边界。 如果这是在科技行业,那么登录1/20 10pm并注销1/21 2am并不奇怪。 ;)

与Rahul的答案类似,但您可以自行加入以获得首次登录/上次登出,并按日期分组以获得您要求的结果;

SELECT CONVERT(DATE,     li.created)  [Date], 
       CONVERT(TIME, MIN(li.created)) [Login],
       CONVERT(TIME, MAX(lo.created)) [Logout] 
FROM Logins li 
JOIN Logins lo 
  ON CONVERT(DATE, li.created) = CONVERT(DATE, lo.created)
 AND li.action = 'login'
 AND lo.action = 'logout' 
GROUP BY CONVERT(DATE, li.created)

一个要测试的SQLfiddle

编辑:未经测试的SQL Server 2005,您可能需要设置varchars的长度;

SELECT CONVERT(VARCHAR, li.created, 110)    [Date], 
       CONVERT(VARCHAR, MAX(li.created), 8) [Login],
       CONVERT(VARCHAR, MAX(lo.created), 8) [Logout] 
FROM Logins li 
JOIN Logins lo 
  ON CONVERT(VARCHAR, li.created, 110) = CONVERT(VARCHAR, lo.created, 110)
 AND li.action = 'login'
 AND lo.action = 'logout' 
GROUP BY CONVERT(VARCHAR, li.created, 110)

另一个SQLfiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM