sql-server - 对连续行进行排名或合并
问题描述
我有一个日志文件,我需要排名(但将顺序和相等的行视为关系),或合并顺序相等的行(基于特定列)。我的表如下所示,开始和停止都是顺序的(在同一个 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, 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
推荐阅读
- abap - 将两个内部表连接并聚合为一张
- azure - Xamarin Android 构建在 AppCenter (Azure) 中失败并出现错误 APT0000
- python - 分组数据处理后向数据框中添加新列时出错
- excel - vba excel中是否有选择要出现的excel窗口的代码?
- apache - 如何使用 Apache 在生产环境中运行 Mercure
- arrays - 从选择表单中保存数组值而不是索引
- mysql - 如何选择 - 更新然后将值复制到另一个表(批量)
- django - 姜戈。休息框架。嵌套关系空结果
- java - Android手机:如何使用Appium简单地打开应用程序而不安装(因为它已经安装)
- android - 片段微调器 onItemSelected 方法从未调用过