案例

时间:2018-08-31 22:20:27

标签: sql google-bigquery

正在使用标准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
  • 对于UserId 0,它为NULL,因为没有第二个登录时间可以比较。
  • 对于UserId 2,它获取两个连续登录日期(07/09-07/10和07/12-07/13)之差的平均值(27小时+ 8小时/ 2)= 5.5小时< / li>
  • 对于UserId 3,同一天登录的一个数据点相差3小时,因此它满足连续条件,并获得了一个数据点的平均相差

1 个答案:

答案 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          

希望您可以根据自己的具体情况进行调整