我有TABLE
列:USER_ID
,TIMESTAMP
和ACTION
每一行都告诉我哪个用户在某个时间戳上执行了哪些操作。
示例:
我想要一个用户列表,它们在启动应用程序的第一行和它们关闭它的最后一行之间有时差。
以下是我尝试这样做的方法:
SELECT USER_ID,DATEDIFF(
(SELECT timestamp FROM MOBILE_LOG WHERE ACTION="START_APP" AND USER_ID="Alice" order by TIMESTAMP LIMIT 1),
(SELECT timestamp FROM MOBILE_LOG WHERE ACTION ="CLOSE_APP" AND USER_ID="Alice" order by TIMESTAMP LIMIT 1)
) AS Duration FROM MOBILE_LOG AS t WHERE USER_ID="Alice";
我要求两个SELECT查询之间的DATEDIFF,但我只得到一个Alice`s列表,其中-2为持续时间。
我是在正确的轨道上吗?
答案 0 :(得分:3)
我认为您应该按USER_ID对此表进行分组,并找到" START_APP"的最短日期。最多" CLOSE_APP"为每个用户。此外,您应首先使用DATEDIFF CLOSE_APP时间,然后START_APP时间,在这种情况下,您将获得正值结果
SELECT USER_ID,
DATEDIFF(MAX(CASE WHEN ACTION="CLOSE_APP" THEN timestamp END),
MIN(CASE WHEN ACTION="START_APP" THEN timestamp END)
) AS Duration
FROM MOBILE_LOG AS t
GROUP BY USER_ID
答案 1 :(得分:2)
SELECT user_id, start_time, close_time, DATEDIFF(close_time, start_time) duration
FROM
(SELECT MIN(timestamp) start_time, user_id FROM MOBILE_LOG WHERE action="START_APP" GROUP BY user_id) start_action
JOIN
(SELECT MAX(timestamp) close_time, user_id FROM MOBILE_LOG WHERE ACTION ="CLOSE_APP" GROUP BY user_id) close_action
USING (user_id)
WHERE USER_ID="Alice";
你制作两张桌子"每个用户的最早开始时间,以及每个用户关闭的最晚时间。然后加入它们,以便同一个用户的动作在一起。
现在您已经完成了所有设置,您可以轻松地在它们之间进行相减。
答案 2 :(得分:2)
你有int值,因为你使用DATEDIFF函数,它会显示两个日期之间的天数,如果你想要使用日期之间的小时数,分钟数和秒数TIMEDIFF 试试这个:
select t1.USER_ID, TIMEDIFF(t2.timestamp, t1.timestamp)
from MOBILE_LOG t1, MOBILE_LOG t2
where (t1.action,t1.timestamp) in (select action, max(timestamp) from MOBILE_LOG t where t.ACTION = "START_APP" group by USER_ID)
and (t1.action,t1.timestamp) in (select action, max(timestamp), max(id) from MOBILE_LOG t where t.ACTION = "CLOSE_APP" group by USER_ID)
and t1.USER_ID = t2.USER_ID
它会显示所有用户的两个最新日期(startdate,enddate)之间的差异。
P.S:对不起,我写的没有任何数据库,可能会有一些错误。如果您遇到问题(t1.action,t1.timestamp) in (select...)
将其拆分为两个:where t1.action in (select ...) and t1.timestamp in (select ...)