MYSQL无法计算日期范围内特定值的出现

时间:2019-03-08 02:01:32

标签: mysql sql

因此,有一个帐号,我们每天提供有关他们付款的信息。假设我们有截止到今天的1年信息,即2019年3月8日,我想计算他/她在过去1周内多付的次数。我已经使用了mysql窗口函数,但是由于某种原因,它似乎不起作用

@GMB示例数据如下所示:假设该帐户具有我们从2018年3月开始的信息。我只想从我今天在文件中的最后一个日期开始,payed_status =超额支付的次数- 2019年3月8日及之前的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获取多行,但是它不能正确地正确计算字段

1 个答案:

答案 0 :(得分:0)

从样本数据看来,您正在寻找一个简单的聚合查询(不需要窗口函数):

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