为具有相同值的连续行生成标识符

Generate Identifier for consecutive rows with same value

我正在尝试获取一个 SQL 服务器查询,该查询需要以某种方式进行分区,以便按日期排序的具有相同类型值的连续行具有相同的唯一标识符。

假设我有以下 table

declare @test table 
              (
                  CustomerId varchar(10),
                  Type int,
                  date datetime
              )

insert into @test values ('aaaa', 1, '2015-10-24 22:52:47')
insert into @test values ('bbbb', 1, '2015-10-23 22:56:47')
insert into @test values ('cccc', 2, '2015-10-22 21:52:47')
insert into @test values ('dddd', 2, '2015-10-20 22:12:47')
insert into @test values ('aaaa', 1, '2015-10-19 20:52:47')
insert into @test values ('dddd', 2, '2015-10-18 12:52:47')
insert into @test values ('aaaa', 3, '2015-10-18 12:52:47')

我希望我的输出列是这样的(数字不需要排序,我只需要每个组的唯一标识符)。

    0
    0
    1
    1
    2
    3
    4

解释:前两行有UD:0因为它们都是类型“1”,然后下一行有不同的类型(“2”)所以它应该是另一个标识符,UD:1 在这种情况下,下一行仍然具有相同的类型所以 UD 是相同的,然后下一个具有不同的类型“1”所以另一个标识符,在这种情况下 UD:2 等等。

customerId列与查询无关,条件应以Type和Date列为准

我的电流几乎可以解决问题,但在某些情况下无法为具有不同类型值的行提供相同的 ID。

SELECT 
    ROW_NUMBER() OVER (ORDER BY date) - 
        ROW_NUMBER() OVER (PARTITION BY Type ORDER BY date)
FROM @TEST

这是一个使用传统解决方案解决的 Gaps and Islands 问题。

例如:

select
  *,
  sum(inc) over(order by date desc, type) as grp
from (
  select *,
    case when type <> lag(type) over(order by date desc, type)
      then 1 else 0 end as inc
  from test
) x
order by date desc, type

结果:

 CustomerId  Type  date                  inc  grp 
 ----------- ----- --------------------- ---- --- 
 aaaa        1     2015-10-24T22:52:47Z  0    0   
 bbbb        1     2015-10-23T22:56:47Z  0    0   
 cccc        2     2015-10-22T21:52:47Z  1    1   
 dddd        2     2015-10-20T22:12:47Z  0    1   
 aaaa        1     2015-10-19T20:52:47Z  1    2   
 dddd        2     2015-10-18T12:52:47Z  1    3   
 aaaa        3     2015-10-18T12:52:47Z  1    4   

参见 SQL Fiddle 中的示例。