簡體   English   中英

帶COUNT(DISTINCT)的mySQL窗口函數

[英]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與行數有關,與天數無關

您需要一個子查詢:

SQL演示

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM