为具有相同值的连续行生成标识符
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 中的示例。
我正在尝试获取一个 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 中的示例。