首页 > 解决方案 > 对连续行进行排名或合并

问题描述

我有一个日志文件,我需要排名(但将顺序和相等的行视为关系),或合并顺序相等的行(基于特定列)。我的表如下所示,开始和停止都是顺序的(在同一个 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);

标签: sql-serverrankingrankmerging-data

解决方案


对完整集合中的聚合子查询使用自联接,例如

rankTable (id, value) as (select 1, 'A' union all select 1, 'A' union all select 1, 'B' union all select 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

推荐阅读