我有我需要或者职务(但处理顺序和平等的行为纽带),或合并顺序等于行(基于特定的列)的日志文件。我的表看起来像下面,启动和停止都被顺序(同一ID窗口中)
ID Start Stop Value
1 0 1 A
1 1 2 A
1 2 3 A
1 3 4 B
1 4 5 B
1 5 6 A
2 3 4 A
我有两种方法来得到我需要什么。
方法1:评价等级(与“值”为关系相等的值处理顺序的行),并且使用ID作为分区。这应该给下面的输出。但我怎么做特别的排名:在“值”为纽带相等值的顺序处理行。
Select *,
rank() OVER (partition by id order by start, stop) as Rank,
XXX as SpecialRank
from Table
ID Start Stop Value Rank SpecialRank
1 0 1 A 1 1
1 1 2 A 2 1
1 2 3 A 3 1
1 3 4 B 4 2
1 4 5 B 5 2
1 5 6 A 6 3
2 3 4 A 1 1
方法2:合并顺序排在“值”相等的值。这一意志应像下面创建一个表。
ID Start Stop Value
1 0 3 A
1 3 5 B
1 5 6 A
2 3 4 A
我不知道这是否会有所帮助,但我还有nextValue列可能在这方面的帮助
ID Start Stop Value NextValue
1 0 1 A A
1 1 2 A A
1 2 3 A B
1 3 4 B B
1 4 5 B A
1 5 6 A A
2 3 4 A ...
实施例表:
CREATE TABLE #Table ( id int, start int, stop int, Value char(1), NextValue char(1));
INSERT INTO #Table values (1,0, 1, 'A', 'A');
INSERT INTO #Table values (1,1, 2, 'A', 'A');
INSERT INTO #Table values (1,2, 3, 'A', 'B');
INSERT INTO #Table values (1,3, 4, 'B', 'B');
INSERT INTO #Table values (1,4, 5, 'B', 'A');
INSERT INTO #Table values (1,5, 6, 'A', 'A');
INSERT INTO #Table values (2,3, 4, 'A', null);
从全套使用自加入到聚合子查询,例如
与rankTable(ID,值)(选择1, 'A' UNION ALL选择1, 'A' UNION ALL选择1, 'B' UNION ALL选择2, 'A')
select t2.* from rankTable t1 join (
select id, value, rank() over (partition by id order by value) as specialRank from
(
select distinct id, value
from rankTable
) t) t2 on t2.id =t1.id and t2.value = t1.value
id value specialRank
1 A 1
1 A 1
1 B 2
2 A 1