Sql server 2008 SQL Server 2008-按时间顺序计算缴纳金额的最小和最大日期

Sql server 2008 SQL Server 2008-按时间顺序计算缴纳金额的最小和最大日期,sql-server-2008,Sql Server 2008,我有一些如下所示的客户财务数据,无法确定如何显示已支付的每个常规金额的开始和结束供款日期。我正在使用SQLServer2008。我的源数据如下所示 Cust Contrib_Date Amount ---- ------------ ------ 100 2013-01-01 500.00 100 2013-02-01 500.00 100 2013-03-02 500.00 100 2013-04-01 500.00 100 2013-05-

我有一些如下所示的客户财务数据,无法确定如何显示已支付的每个常规金额的开始和结束供款日期。我正在使用SQLServer2008。我的源数据如下所示

Cust  Contrib_Date  Amount
----  ------------  ------
100   2013-01-01    500.00
100   2013-02-01    500.00
100   2013-03-02    500.00
100   2013-04-01    500.00
100   2013-05-05    600.00
100   2013-06-06    600.00
100   2013-07-05    600.00
100   2013-09-10    500.00
100   2013-10-10    500.00
100   2013-11-10    500.00
100   2013-12-11    500.00
200   2010-01-01    100.00
200   2010-02-02    100.00
200   2010-03-09    300.00
下面是我试图从输出中得到的

Cust  Start_Date  End_Date    Amount 
----  ----------  ----------  ------ 
100   2013-01-01  2013-04-01  500.00  
100   2013-05-05  2013-07-05  600.00  
100   2013-09-10  2013-12-11  500.00  
200   2010-01-01  2010-02-02  100.00  
200   2010-03-09  2010-03-09  300.00  
客户每月定期向一个账户缴款。各期间的金额保持不变(Cust=100时我们有3个,即第一期支付500.00,第二期支付600.00,第三期返回500.00),但由于上述周末、公共假日等原因,供款日期可能会有几天略有不同。因此,我需要循环浏览数据,按时间顺序为每个客户的每个金额找到最小和最大供款日期,当我遇到不同的金额时,再次启动流程。将有许多客户需要这样做

我对SQL相对来说还行,但不知道如何实现这一点。有人有什么想法吗?有人能帮忙吗?我以前使用过游标,但不是经常使用。

试试这个:

SELECT  y.Cust, 
        MIN(y.Contrib_Date) AS FromDate, 
        MAX(y.Contrib_Date) AS ToDate, 
        y.Amount
FROM (
    SELECT  x.Cust, x.Contrib_Date, x.Amount,
            ROW_NUMBER() OVER(PARTITION BY Cust ORDER BY x.Contrib_Date ASC) 
            - 
            ROW_NUMBER() OVER(PARTITION BY Cust ORDER BY x.Amount ASC) AS GroupID
    FROM    @Contrib x
) y
GROUP BY y.Cust, y.GroupID, y.Amount
ORDER BY y.Cust, FromDate;
输出:

Cust FromDate   ToDate     Amount
---- ---------- ---------- ------
100  2013-01-01 2013-04-01 500.00
100  2013-05-05 2013-07-05 600.00
100  2013-09-10 2013-12-11 500.00
200  2010-01-01 2010-02-02 100.00
200  2010-03-09 2010-03-09 300.00

这几乎奏效了。问题是Cust=200的GroupID将两个不同的金额(100.00和300.00)组合在一起,并使用金额=100.00的最早缴款日期作为金额=300.00的起始日期,但使用金额=300.00的最早缴款日期。所以,在输出中应该有两个数量(100.00和300.00),但我只得到300.00的输出。绝对精彩!!我试过了,效果很好。非常感谢你,博格丹。我现在可以睡觉了。@BogdanSahlean:+1这是一个非常好的技巧,可以正确地划分付款顺序。谢谢你把这些数据整理好。(@Fred_Scuttle:在提问时提供这种样本数据负载,而不是依赖社区为每个答案提供样本数据负载,这是非常理想的。)