[英]MYSQL Cannot count the occurrence of a particular value in a date range
因此,有一個帳號,我們每天都有關於他們付款的信息。 假設我們有截止到今天的1年信息,即2019年3月8日,我想計算他/她在過去1周內多付的次數。 我已經使用了mysql窗口函數,但是由於某種原因它似乎無法正常工作
@GMB示例數據如下所示:假設該帳戶具有我們自2018年3月以來的信息。我只想從我今天在文件中的最后一個日期(即今天-3月8日)起,paid_status =超額付款的次數/ 2019及之前的7天,14天,1個月或我選擇的任何持續時間。 您的查詢僅會硬編碼7天。
ACCOUNT_ID paid_status amt dte
-----------------------
1234 overpaid 100 01/March/2018
.
.
.
1234 overpaid 120 01/March/2019
1234 not paid 0 02/March/2019
1234 overpaid 110 03/March/2019
1234 overpaid 120 04/March/2019
1234 overpaid 130 05/March/2019
1234 overpaid 120 06/March/2019
1234 overpaid 120 07/March/2019
1234 overpaid 121 08/March/2019
查詢:
,COUNT(CASE WHEN paid_status = 'OVERPAID' THEN 1 END)
over (PARTITION BY ACCOUNT_ID
ORDER BY DTE ROWS BETWEEN 7 PRECEDING AND UNBOUNDED FOLLOWING
) AS num_times_overpaid_week1
輸出應該是這樣的(不包括今天的信息):
account_id num_times_overpaid_week1
1234 6
當我為同一個account_id獲取多行時,它無法正確計算字段
從樣本數據看來,您正在尋找一個簡單的聚合查詢(不需要窗口函數):
SELECT account_id, SUM(paid_status = 'OVERPAID') AS num_times_overpaid_week1
FROM mytable
WHERE dte >= CURRENT_DATE - INTERVAL 7 DAY
GROUP BY account_id
表達式SUM(paid_status = 'OVERPAID')
使用了很好的MySQL功能,條件滿足時返回1
,否則返回0
。
注意:如果由於某種原因,您確實想使用窗口函數(也許要執行其他計算),則需要使用ROW_NUMBER()
按日期對記錄進行排名,並且僅過濾出每個帳戶中的最新記錄外部查詢。 我認為可以大大簡化窗口的定義:
SELECT *
FROM (
SELECT
account_id,
SUM(paid_status = 'OVERPAID') OVER(PARTITION BY account_id) AS num_times_overpaid_week1,
-- possibly other columns
ROW_NUMBER() OVER(PARTITION BY account_id ORDER BY dte DESC) rn
FROM mytable
WHERE dte >= CURRENT_DATE - INTERVAL 7 DAY
) x WHERE rn = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.