我提供了一个关于数据外观的示例。该表填充了负面的customerid余额。每天都会生成一个报告,其中任何customerid都会带有负余额。报告将使用新的reportdate导入到我的表中。我有办法实现以下目标:
在customerID达到找到的最大ending_amount的第一个日期返回行。这意味着如果customerid在20天数据的第10天达到-3.50的ending_amount,我希望它仅返回20天第10天的数据行,并忽略与该customerid相关的其他19天数据。
注意:
** - ** Customerid是一个独特的值。
** - ** start_amount<> ending_amount,表示该帐户余额已发生变化。
无论如何,我可以通过清理这个表格或者通过编写查询来实现我的目标吗?
感谢您的帮助。
Expected Data output
reportdate customerid starting_amount ending_amount
1/1/17 2 -0.00 -0.50
1/3/17 3 -0.50 -1.00
1/4/17 1 -0.50 -3.27
1/4/17 4 -0.00 -0.50
1/4/17 5 -0.50 -1.32
示例数据
tbl_accountchange
reportdate customerid starting_amount ending_amount
1/1/17 1 -0.00 -0.50
1/1/17 2 -0.00 -0.50
1/2/17 1 -0.50 -0.50
1/2/17 2 -0.50 -0.50
1/2/17 3 -0.00 -0.50
1/3/17 1 -0.50 -0.50
1/3/17 2 -0.50 -0.50
1/3/17 3 -0.50 -1.00
1/3/17 4 -0.00 -0.50
1/3/17 5 -0.00 -0.50
1/4/17 1 -0.50 -3.27
1/4/17 2 -0.50 -0.50
1/4/17 3 -1.00 -1.00
1/4/17 4 -0.50 -0.50
1/4/17 5 -0.50 -1.32
答案 0 :(得分:0)
查找每位客户的最大结束金额:
select customerId, max(ending_amount) max_ea
from tbl_accountchange
where reportdate between '2017-01-01' and '2017-01-20'
group by 1
要查找每个客户发生此值的最早日期:
select a.customerId, min(reportdate) rd
from tbl_accountchange a
join (
-- above query
) b on a.customerId = b.customerId
and a.ending_amount = max_ea
group by 1
整个查询:
select t.*
from tbl_accountchange t
join (select a.customerId, min(reportdate) rd
from tbl_accountchange a
join (
select customerId, max(ending_amount) max_ea
from tbl_accountchange
where reportdate between '2017-01-01' and '2017-01-20'
group by 1
) b on a.customerId = b.customerId
and a.ending_amount = max_ea
where reportdate between '2017-01-01' and '2017-01-20') c
on t.customerId = c.customerId
and t.reportdate = c.reportdate
没有任何查询是相关的,因此即使对于大型数据集,它也应该表现得非常好。
请注意,日期范围条件必须在两个子查询中。