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

Posted

技术标签:

【中文标题】CASE WHEN 中连续日期的平均小时数差异【英文标题】:Average difference in hours for Consecutive Dates in CASE WHEN 【发布时间】:2018-08-31 22:20:27 【问题描述】:

使用标准 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小时,符合连续条件,得到一个数据点的平均差异

【问题讨论】:

。 .请编辑您的问题并显示您想要获得的结果。您的问题提到了日期之间的差异,但您的行有多个日期。很难弄清楚你想做什么。 感谢收看,立即编辑 @GordonLinoff 已编辑。应该抓住这一点,改变我的问题 - 但理想的结果就在那里。 。 .我还是不明白。用户 2 在连续日期有 2 次登录。这些相隔大约 27 小时。我看不出 5.5 是从哪里来的。 @GordonLinoff 道歉!固定! 【参考方案1】:

以下 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          

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

【讨论】:

以上是关于CASE WHEN 中连续日期的平均小时数差异的主要内容,如果未能解决你的问题,请参考以下文章

在PL/SQL中 使用 case when 语句求两个条件合并统计的平均值

删除“case when”中的重复项并计算步骤之间的平均值

SQL使用CASE WHEN 行转列为啥会出现NULL值?

在 SQL 中选择日期之间的平均差异

日最大8小时滑动平均 啥 意思

使用 partition by 和 case when