我正在尝试编写一个查询,该查询返回日期列表和每个日期之前 7 天的用户 ID 的不同计数。我正在使用的表格很简单,看起来像这样:
Started UserId
"2012-09-25 00:01:04" 164382
"2012-09-25 00:01:39" 164382
"2012-09-25 00:02:37" 166121
"2012-09-25 00:03:35" 155682
"2012-09-25 00:04:18" 160947
"2012-09-25 00:08:19" 165806
我可以如下编写单个 COUNT 输出的查询:
SELECT COUNT(DISTINCT UserId)
FROM Session
WHERE Started BETWEEN '2012-09-18 00:00' AND '2012-09-25 00:00';
但我想要做的是在表格中的每一天和它之前的 7 天输出这个 COUNT。澄清一下,9 月 25 日的值将是 18 日和 25 日之间的不同用户 ID 的计数,24 日是 17 日和 24 日之间的计数,等等。
我尝试了以下查询,但它只提供了每天的计数:
SELECT
DATE(A.Started),
Count(DISTINCT A.UserId)
FROM Session AS A
WHERE DATE(A.Started) BETWEEN DATE(DATE_SUB(DATE(DATE(A.Started)),INTERVAL 7 DAY)) AND DATE(DATE(A.Started))
GROUP BY DATE(A.Started)
ORDER BY DATE(A.Started);
输出看起来像这样:
DATE(A.Started) "Count(DISTINCT A.UserId)"
2012-09-18 709
2012-09-19 677
2012-09-20 658
2012-09-21 556
2012-09-22 530
2012-09-23 479
2012-09-24 528
2012-09-25 480
...
但正如我所说,这些只是每日计数。最初我以为我可以只对 7 天的值求和,但这会使 DISTINCT 子句无效。 我需要给定日期之前每 7 天的 DISTINCT UserId 计数。
最佳答案
这个查询应该适合你:
SELECT
DATE_FORMAT(d1.Started, '%Y-%m-%d') AS Started,
COUNT(DISTINCT d2.UserID) Users
FROM
(
SELECT
DATE(Started) AS Started
FROM
Session
GROUP BY
DATE(Started)
) d1
INNER JOIN
(
SELECT DISTINCT
DATE(Started) AS Started,
UserID
FROM
Session
) d2
ON d2.Started BETWEEN d1.Started - INTERVAL 7 DAY AND d1.Started
GROUP BY
d1.Started
ORDER BY
d1.Started DESC
访问http://sqlfiddle.com/#!2/9339c/5查看此查询的运行情况。
关于MySQL 查询以检索移动 DATE 期间之间的 DISTINCT COUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12631801/