我有一個users 保存用戶注冊時user_id的時間戳的表。created_at我想查找每天的注冊用戶數和每天前 30 天的注冊用戶數。
要查找每天的注冊用戶數,我有:
SELECT DATE_FORMAT(date(created_at),'%d %M %Y') AS Days, COUNT(user_id) as Profiles
FROM users
GROUP BY YEAR(created_at), MONTH(created_at), DAY(created_at);
要查找過去 30 天內的注冊用戶數,我有這個:
SELECT current_date(),COUNT(user_id)
FROM users
WHERE created_at >= NOW() - INTERVAL 30 DAY;
現在我需要做同樣的事情,但我需要為第一次查詢生成的所有日期而不是current_date()or日期。now()
我需要它與 mysql5 和 8 一起作業。
感謝您的幫助!
uj5u.com熱心網友回復:
SELECT DISTINCT users.created_at, SUM(Profiles)
FROM users
JOIN (
SELECT created_at, COUNT(user_id) as Profiles
FROM users
GROUP BY created_at
) counts
ON counts.created_at BETWEEN users.created_at - INTERVAL 30 DAY AND users.created_at
GROUP BY users.created_at;
uj5u.com熱心網友回復:
您可以創建一個單獨的查詢,該查詢使用視窗函式來計算運行總和,然后將此資料連接到第一個查詢:
SELECT SUBSTR(created_at,1,10) AS "Dtm", COUNT(user_id), T1.SumCnt
FROM users
LEFT JOIN
(
SELECT
Dtm,
Cnt,
SUM(Cnt) OVER (ORDER BY Dtm) AS SumCnt
FROM (
SELECT
SUBSTR(created_at, 1,10) AS "Dtm",
COUNT(user_id) as "Cnt"
FROM users
WHERE users.created_at > NOW() - INTERVAL 30 DAY
GROUP BY Dtm
) S1
) T1 ON (SUBSTR(users.created_at,1,10)=T1.Dtm)
WHERE users.created_at > NOW() - INTERVAL 30 DAY
GROUP BY Dtm ORDER BY 1
注意:這需要 MySQL 8 才能作業。
uj5u.com熱心網友回復:
由于您需要它與 mysql5 和 8 一起使用,因此視窗函式顯然是不可能的。我們必須利用 mysql 5.x 支持的特性來達到最大的兼容性。首先,我們需要在一個子查詢中計算每一天的 user_id 計數,該子查詢用作基表。然后我們可以使用 SELECT 串列中的相關子查詢來獲取 30 天的總和(包括每天和之前的 29 天,您可以調整)。這是在作業臺中撰寫和測驗的代碼。
select ts as days,
(select sum(ct)
from
(select count(user_id) ct, created_at ts from users group by created_at) tt
where ts between t.ts - interval 29 day and t.ts) as 30_day_sum
from
(select count(user_id) ct, created_at ts from users group by created_at) t
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486983.html
標籤:mysql sql mysql-5.7 mysql-8.0
下一篇:c 如何覆寫子類中的方法
