正在使用标准SQL / BQ,但试图找出一种方法来获取每个用户连续两个日期的两个时间戳之间的平均差吗?
我的数据如下:
UserId Login
0 2016-07-14 14:43:30 +0000
2 2018-07-09 17:19:55 +0000
2 2018-07-10 20:38:37 +0000
2 2014-07-12 17:37:20 +0000
2 2018-07-13 01:08:20 +0000
3 2015-12-04 17:17:41 +0000
3 2015-12-04 20:14:43 +0000
因此,我现在有:
SELECT UserId
,CASE WHEN(
(Magic)
THEN AVG(TIMESTAMP_DIFF(Login2, Login, HOUR) ELSE NULL END))) AS hours
FROM TABLE
GROUP BY 1
(魔术)部分是固定的部分,我想在其中指定每个用户的日期是否连续,然后取最新登录日期的差值并减去当前登录日期。我可以说一下下一个日期与第一个日期之间的差是否在一天之内,那么这是连续的吗?还是有分区/窗口函数的方法?
Login2将是下一个连续日期的第二个登录时间戳。
我想要的结果:
UserId Average Hours between Consecutive Logins
0 NULL
2 17.5 hours
3 3 hours
答案 0 :(得分:2)
以下BigQuery标准SQL示例
#standardSQL
WITH `project.dataset.table` AS (
SELECT 0 UserId, TIMESTAMP '2016-07-14 14:43:30' Login UNION ALL
SELECT 2, '2018-07-09 17:19:55' UNION ALL
SELECT 2, '2018-07-10 20:38:37' UNION ALL
SELECT 2, '2018-07-12 17:37:20' UNION ALL
SELECT 2, '2018-07-13 01:08:20' UNION ALL
SELECT 3, '2015-12-04 17:17:41' UNION ALL
SELECT 3, '2015-12-04 20:14:43'
)
SELECT
UserId,
ROUND(AVG(IF(
TIMESTAMP_DIFF(TIMESTAMP_TRUNC(next_Login, DAY), TIMESTAMP_TRUNC(Login, DAY), DAY) < 2,
TIMESTAMP_DIFF(next_Login, Login, MINUTE), NULL
))/60, 2) average_hours
FROM (
SELECT UserId, Login,
LEAD(Login) OVER(PARTITION BY UserId ORDER BY Login) next_Login
FROM `project.dataset.table`
)
GROUP BY UserId
ORDER BY UserId
结果为
Row UserId average_hours
1 0 null
2 2 17.41
3 3 2.95
希望您可以根据自己的具体情况进行调整