【问题标题】:SQL distinct counts with a lookback window grouped by date带有按日期分组的回溯窗口的 SQL 非重复计数
【发布时间】:2017-04-24 09:02:39
【问题描述】:

试图找到运行查询的最佳方法,该查询具有按天计数以及具有最近 x 天计数的列,但它变得比我意识到的更复杂。

我正在尝试以下方式:

SELECT
date(created_at),
count(DISTINCT(user_id)) AS daily_users,
count(
    DISTINCT (
        CASE
        WHEN date(created_at) BETWEEN date_sub(created_at, INTERVAL 2 DAY)
        AND created_at THEN
            user_id
        END
    )
) AS users_2_day_lookback
FROM
table.users
WHERE
date(created_at) BETWEEN 'yyyy-mm-dd'
AND now()
GROUP BY
1

但是 2 天回顾栏没有返回任何内容。我觉得这应该通过某种可能涉及自连接的外部查询来完成,但我不确定该语法会是什么样子。任何帮助将不胜感激。

【问题讨论】:

  • 我认为这不是SQL-Server 问题,而是mysql 问题。如果是这种情况,请删除标签。

标签: mysql sql syntax


【解决方案1】:

按天计算的查询:

select date(created_at),
       count(distinct user_id) as daily_users
from table.users u
group by date(created_at);

这两天的回顾是这样的:

select dte, daily_users,
       (select count(distinct u2.user_id)
        from table.users u2
        where u2.created_at >= date_sub(dte, interval 2 days) and
              u2.created_at < date_add(dte, interval 1 day)
       ) as users_2_day_lookback
from (select date(created_at) as dte,
             count(distinct user_id) as daily_users
      from table.users u
      group by date(created_at)
      ) u;

此查询将“2 天回顾”解释为当天加上前两天。更改 where 条件以获取替代定义很容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多