因此,有一个帐号,我们每天提供有关他们付款的信息。假设我们有截止到今天的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获取多行,但是它不能正确地正确计算字段
答案 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