簡體   English   中英

MYSQL無法計算日期范圍內特定值的出現

[英]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.

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