【问题标题】:How to get users which were online everyday last week?如何获取上周每天在线的用户?
【发布时间】:2018-11-09 13:53:18
【问题描述】:

数据示例:

id  visiting_time
1   13.01.2001 02:34
1   14.01.2001 02:36
1   15.01.2001 02:36
1   16.01.2001 02:37
1   17.01.2001 02:38
1   18.01.2001 02:39
1   19.01.2001 02:40
2   13.01.2001 02:35
2   15.01.2001 02:36
2   16.01.2001 02:37
2   17.01.2001 02:38
2   18.01.2001 02:39
2   19.01.2001 02:40

我想获取上周每天在线的所有用户,例如从 1 月 13 日 00:00 到 1 月 20 日 00:00。 对于我的数据样本,答案是:

id
1

【问题讨论】:

  • 你如何定义上周?与今天相比?与作为一周开始的特定日期相比?
  • 我自己指出来。一般来说,我可以选择任意天数。
  • 为什么没有YYYY-MM-DD HH:MM:SS 格式?你能告诉我们你的create table声明吗?

标签: sql clickhouse


【解决方案1】:

考虑

上周的每一天,f.e. 1月13日00:00至20日 一月 00:00

我自己指出来。一般来说,我可以选择任意天数 想要。

我猜它只能用作过滤器,因此任务是“在选定的时间间隔内每天查找在线用户

SELECT id,
       count(DISTINCT toDate(visiting_time)) AS number_of_days_visited
FROM user_visits
WHERE visiting_time BETWEEN '2001-01-13 00:00:00' AND '2001-01-20 00:00:00'
GROUP BY id
HAVING number_of_days_visited =
       round((toUInt32(toDateTime('2001-01-20 00:00:00')) - toUInt32(toDateTime('2001-01-13 00:00:00'))) / 60 / 60 / 24)

在 HAVING 中,我根据 WHERE 过滤器计算了天数。

【讨论】:

    【解决方案2】:

    以下代码仅在visiting_time 列格式为YYYY-MM-DD HH:MM 时才有效,否则日期不可比较:

    SELECT t.id FROM (SELECT id, COUNT(DISTINCT substr(visiting_time, 1, 10)) AS counter From table1 WHERE ((visiting_time >= '2001-01-13 00:00' AND visiting_time < '2001-01-20 00:00')) GROUP BY id) AS t WHERE t.counter=7
    

    【讨论】:

    • 它不会每天检查,它返回至少匹配一个的id。
    • 我以为你想要不同的 ID。如果一个用户每天都在桌子上,你要他多次吗?
    • 我从声明中删除了 DISTINCT。请参阅我编辑的答案。
    • 不,DISTINCT 无关紧要。您的请求返回每周至少一次的用户,我需要那些每天都在的用户。
    • 好的。我会试一试,稍后再回来。
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多