增加组的行数以获得定期提款金额

时间:2014-04-25 16:32:03

标签: sql-server sql-server-2008

我需要创建一个SQL Server查询,该查询将“常见”顺序数据组合在一起,并为该组分配唯一ID。在下面的示例中,我定期从政策中提取。

create table #Temp2 (Policy_Id int, WDL_Date int, Amount decimal(9,2));

insert into #Temp2 values(1001, 19881028, 190.00);
insert into #Temp2 values(1001, 19881129, 190.00);
insert into #Temp2 values(1001, 19881229, 494.89);
insert into #Temp2 values(1001, 19890130, 494.89);
insert into #Temp2 values(1001, 19890227, 494.89);
insert into #Temp2 values(1001, 19890330, 494.89);
insert into #Temp2 values(1001, 19890530, 525.00);
insert into #Temp2 values(1001, 19890629, 525.00);
insert into #Temp2 values(1001, 19890728, 525.00);
insert into #Temp2 values(1001, 19890830, 525.00);
insert into #Temp2 values(1001, 19930723, 51.00);
insert into #Temp2 values(1001, 19931213, 190.00);
insert into #Temp2 values(1001, 19940311, 190.00);
insert into #Temp2 values(1001, 19940613, 190.00);

insert into #Temp2 values(1002, 19881028, 50.00);
insert into #Temp2 values(1002, 19881129, 50.00);
insert into #Temp2 values(1002, 19881229, 60.00);
insert into #Temp2 values(1002, 19890130, 100.00);
insert into #Temp2 values(1002, 19890227, 100.00);

我想创建下面的输出,其中列ID由查询填充。请注意,金额按日期顺序排序,该日期顺序应确定字段Id中的值。

Policy_Id   WDL_Date    Amount  Id
---------   --------    ------  --
1001        19881028    190.00  1   
1001        19881129    190.00  1
1001        19881229    494.89  2
1001        19890130    494.89  2
1001        19890227    494.89  2
1001        19890330    494.89  2
1001        19890530    525.00  3
1001        19890629    525.00  3
1001        19890728    525.00  3   
1001        19890830    525.00  3
1001        19930723    51.00   4
1001        19931213    190.00  5
1001        19940311    190.00  5
1001        19940613    190.00  5

1002        19881028    50.00   1
1002        19881129    50.00   1
1002        19881229    60.00   2
1002        19890130    100.00  3
1002        19890227    100.00  3

我尝试使用DENSE_RANK()来填充Id,但我遇到的问题是190.00的2个单独分组数量(Policy_Id = 1001的前2和下3个记录)需要保持独立并且DENSE_RANK()声明将190.00的两组视为一组。我还需要在每个新策略中重新启动分组。这是我的代码,它不会产生所需的输出。

select *,
       DENSE_RANK() over (order by policy_id, amount) as Id
from
    #Temp2
order by policy_id, WDL_Date;    

任何人都可以就此提供任何指导吗?

1 个答案:

答案 0 :(得分:0)

将所有190.00组合在一起你需要做这样的事情......

SELECT *,
       DENSE_RANK() OVER (PARTITION BY policy_id ORDER BY amount) as Id
FROM
    #Temp2
ORDER BY policy_id, ID; 

您所需的输出有一些差异,因为当您在排名功能中按金额订购时,51.00应该是第一个值而不是190.00