![](/img/trans.png)
[英]count(distinct(person_id)) not working with window function in MySQL database
[英]mySQL window function with COUNT(DISTINCT)
我想在MySQL中編寫一個窗口函數,該函數提供30天的滾動,計算唯一ID。 更准確地說,我的數據庫每天有很多條目作為時間戳,包含許多不同的ID。 我想每天計算連接多少個不同的ID,還要每天獲取過去30天內在線的ID總數。
請考慮下表:
CREATE TABLE `my_database` (
`timestamp` BIGINT(20) UNSIGNED NOT NULL,
`id` VARCHAR(32) NOT NULL);
INSERT INTO my_database (timestamp,id) VALUES (CURDATE(),1);
INSERT INTO my_database (timestamp,id) VALUES (DATE_SUB(CURDATE(), INTERVAL 1 DAY),2);
INSERT INTO my_database (timestamp,id) VALUES (DATE_SUB(CURDATE(), INTERVAL 2 DAY),1);
INSERT INTO my_database (timestamp,id) VALUES (DATE_SUB(CURDATE(), INTERVAL 2 DAY),3);
INSERT INTO my_database (timestamp,id) VALUES (DATE_SUB(CURDATE(), INTERVAL 29 DAY),4);
INSERT INTO my_database (timestamp,id) VALUES (DATE_SUB(CURDATE(), INTERVAL 300 DAY),2);
INSERT INTO my_database (timestamp,id) VALUES (DATE_SUB(CURDATE(), INTERVAL 1000 DAY),5);
看起來像:
timestamp id
20190730 1
20190729 2
20190728 1
20190728 3
20190701 4
20181003 2
20161102 5
我想得到的結果如下:
date count_day count_30day
2019-07-30 1 4
2019-07-29 1 4
2019-07-28 2 3
2019-07-01 1 1
2018-10-03 1 1
2016-11-02 1 1
我不知道如何獲取count_30day列。 到目前為止,我已經寫了以下內容:
SELECT DATE(a.`timestamp`) AS 'date',
COUNT(DISTINCT a.id) AS 'count_day',
COUNT(DISTINCT a.id) OVER (ORDER BY DATE(a.`timestamp`) ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) AS 'count_30day'
FROM my_database AS a
GROUP
BY DATE(a.`timestamp`)
ORDER
BY DATE(a.`timestamp`) DESC
但是,這不適用於count_30day列。 我一直在尋找其他問題,據我所知,窗口函數的文檔和語法似乎是正確的,但顯然是不正確的,因為這不起作用。 如何正確編寫窗口函數? 除了COUNT(DISTINCT)之外,還有其他更好的方法嗎? 謝謝!!
ROWS PRECEDING
與行數有關,與天數無關
您需要一個子查詢:
SELECT DATE(a.`timestamp`) AS 'date',
COUNT(DISTINCT a.id) AS 'count_day',
MAX( (SELECT COUNT(DISTINCT ID)
FROM my_database db2
WHERE db2.timestamp between DATE_SUB(a.timestamp, INTERVAL 30 DAY)
and a.timestamp
)
) as count30
FROM my_database AS a
GROUP
BY DATE(a.`timestamp`)
ORDER
BY DATE(a.`timestamp`) DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.