在一个日期列表(或任何列表)上循环,并在mysql或snowflake中附加查询

xj3cbfub  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(309)

我是新的sql语言和最近雪花。我有一个表,其中包含企业所有用户的所有签入日期

  1. user_id | checkin_date
  2. 001 03-06-2018
  3. 001 07-07-2018
  4. 001 08-01-2018
  5. 002 03-19-2018
  6. 002 03-27-2018
  7. 002 07-11-2018

现在我想做一个查询,这样我就可以从查询日期向后看,看看每个用户在查询日期-7和查询日期,查询日期-90和查询日期之间签入了多少次。。。下面的雪花查询正确地完成了查询\u date='2018-08-01'的工作。

  1. with user_checkin_history_sum as (
  2. select
  3. user_id,
  4. sum(iff(datediff(DAY, uc.checkin_date, '2018-08-01') <= 7, 1, 0)) as visits_past_7_days,
  5. sum(iff(datediff(DAY, uc.checkin_date, '2018-08-01') <= 90, 1, 0)) as visits_past_90_days,
  6. from user_checkin as uc
  7. where uc.checkin_date < '2018-08-01'
  8. group by user_id
  9. order by user_id
  10. )

这给了我结果

  1. user_id | visits_past_7_days | visits_past_90_days
  2. 001 0 2
  3. 002 0 1

我的问题是,如果我有超过一天作为查询日期,也就是说,我有一个签入日期列表,对于列表中的每个签入日期,我按照上面的方式进行查询,并将它们附加在一起。基本上,它是一个loop-over+table-append,但是我没有找到一个在sql语言中如何做到这一点的答案。基本上,我想做的是

  1. with user_checkin_history_sum as (
  2. select
  3. user_id,
  4. sum(iff(datediff(DAY, uc.checkin_date, query_date) <= 7, 1, 0)) as visits_past_7_days,
  5. sum(iff(datediff(DAY, uc.checkin_date, query_date) <= 90, 1, 0)) as visits_past_90_days,
  6. from user_checkin as uc
  7. where uc.checkin_date < query_date and
  8. LOOP OVER
  9. query_date in ('2018-08-01', '2018-06-01')
  10. group by user_id
  11. order by user_id
  12. )

希望它能给出这个结果

  1. user_id | query_date | visits_past_7_days | visits_past_90_days
  2. 001 '08-01-2018' 0 2
  3. 002 '08-01-2018' 0 1
  4. 001 '06-01-2018' 0 1
  5. 002 '06-01-2018' 0 2
dy1byipe

dy1byipe1#

您应该能够交叉联接包含要检查的所有日期的表:

  1. WITH dates AS (
  2. SELECT '2018-06-01' AS query_date UNION ALL
  3. SELECT '2018-08-01' UNION ALL
  4. ... -- maybe other dates as well
  5. ),
  6. user_checkin_history_sum AS (
  7. SELECT
  8. uc.user_id,
  9. d.query_date,
  10. SUM(IFF(DATEDIFF(DAY, uc.checkin_date, d.query_date) <= 7, 1, 0)) AS visits_past_7_days,
  11. SUM(IFF(DATEDIFF(DAY, uc.checkin_date, d.query_date) <= 90, 1, 0)) AS visits_past_90_days
  12. FROM dates d
  13. CROSS JOIN user_checkin AS uc
  14. WHERE uc.checkin_date < '2018-08-01'
  15. GROUP BY d.query_date, uc.user_id
  16. ORDER BY d.query_date, uc.user_id
  17. )
展开查看全部

相关问题