清理每天重复的数据

时间:2017-05-16 07:42:06

标签: mysql

我提供了一个关于数据外观的示例。该表填充了负面的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           

1 个答案:

答案 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

没有任何查询是相关的,因此即使对于大型数据集,它也应该表现得非常好。

请注意,日期范围条件必须在两个子查询中。