我想为SQLite3数据库创建一个SQL查询。
在我的表格中,我有以下示例数据
7/1/2011 8:00 LOGIN
7/1/2011 10:12 LOGOFF
7/1/2011 10:20 LOGIN
7/1/2011 17:15 LOGOFF
7/2/2011 9:00 LOGIN
7/3/2011 10:00 LOGIN
7/3/2011 20:00 LOGOFF
基本上我想只获得每个日期的第一个LOGIN条目和同一日期的最后一个LOGOFF条目(如果有的话)
所以我希望查询生成
7/1/2011 8:00 LOGIN
7/1/2011 17:15 LOGOFF
7/2/2011 9:00 LOGIN
7/3/2011 10:00 LOGIN
7/3/2011 20:00 LOGOFF
是否也可以使用所需的输出表计算时间差?
IE / 2011年7月1日将是9:15
答案 0 :(得分:3)
假设您的列名为Date, Time, Action
,这就是您所需要的:
select Date,
case Action
when 'LOGIN' then Min(Time)
when 'LOGOFF' then Max(Time)
end as ActionTime,
Action
from YourTable
group by Date, Action
<强>更新强>
为计算差异,您可能希望将一天的行“展平”为一行:
select Date, MinLoginTime, MaxLogoffTime, MaxLogoffTime - MinLoginTime as Diff
from
(
select Date,
Min(
case Action
when 'LOGIN' then Time
else null
end
) as MinLoginTime,
Max(
case Action
when 'LOGOFF' then Time
else null
end
) as MaxLogoffTime
from YourTable
group by Date
) YourDT
一些注意事项:
Diff
将为空Diff
。对SQLite进行一些研究,每个RDBMS都有其特殊性。答案 1 :(得分:2)
为什么不每天都把它们放在同一条线上?
SELECT
LogIns.Date, LogInHour, LogOffHour
FROM
(SELECT Date, MIN(hour) LogInHour
FROM MyTable
WHERE action = 'LOGIN'
GROUP BY Date) LogIns
LEFT JOIN
(SELECT Date, MAX(hour) LogOffHour
FROM MyTable
WHERE action = 'LOGOFF'
GROUP BY Date) LogOffs
ON LogIns.Date = LogOffs.Date
我使用了LEFT JOIN,因为你可能在一天内有一个LOGIN但没有LOGOFF。