CASE WHEN中连续日期的平均小时数差异

问题描述 投票:0回答:1

使用标准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小时之间的平均值之间的平均值
  • 对于UserId 3,一个数据点具有相同的一天登录,具有3小时的差异,因此它适合连续条件,并获得一个数据点的平均差异
sql google-bigquery
1个回答
2
投票

下面是BigQuery Standard 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          

希望您能够根据具体情况进行调整,如果有的话

© www.soinside.com 2019 - 2024. All rights reserved.