SQL 根据现有序列排名?
SQL Ranking on existing sequence?
我有一个数据集,我正在尝试对其应用二级排名,但不确定如何进行。
数据集看起来像:
ID Sequence Event
xxx 1
xxx 2 B
xxx 3 B
xxx 4 B
xxx 5 B
xxx 6 A
xxx 7
xxx 8 C
xxx 9 C
xxx 10 C
xxx 11 C
xxx 12 C
我尝试了一些 Ranking/Partitioning 组合,我得到的最接近的组合是:
DENSE_RANK() OVER (Partition BY ID ORDER BY ID, Event)
然而,当我这样做时,结果排名以无序的方式对事件进行排名,我知道它是按事件的字母顺序排列的:
ID Sequence Event Event Sequence
xxx 1 1
xxx 2 B 3
xxx 3 B 3
xxx 4 B 3
xxx 5 B 3
xxx 6 A 2
xxx 7 1
xxx 8 C 4
xxx 9 C 4
xxx 10 C 4
xxx 11 C 4
xxx 12 C 4
我试图将序列添加到排序方式中,但它不再按照我想要的方式对事件进行分组,而是简单地模拟序列系列。
我希望的是:
ID Sequence Event Event Sequence
xxx 1 1
xxx 2 B 2
xxx 3 B 2
xxx 4 B 2
xxx 5 B 2
xxx 6 A 3
xxx 7 1
xxx 8 C 4
xxx 9 C 4
xxx 10 C 4
xxx 11 C 4
xxx 12 C 4
这可能吗?
如果我没理解错的话,您可以使用 id
值中的最小值进行排序:
select t.*, dense_rank() over (order by min_sequence) as event_sequence
from (select t.*, min(sequence) over (partition by event) as min_sequence
from t
) t
order by t.id;
试试这个:
DECLARE @mytab table (id INT,Sequence INT, [Event] VARCHAR(1))
insert into @mytab
SELECT 1,1,''
union
SELECT 1,2,'B'
union
SELECT 1,3,'B'
union
SELECT 1,4,'B'
union
SELECT 1,5,'B'
union
SELECT 1,6,'A'
union
SELECT 1,7,''
union
SELECT 1,8,'C'
union
SELECT 1,9,'C'
union
SELECT 1,10,'C'
union
SELECT 1,11,'C'
union
SELECT 1,12,'C'
select *, DENSE_RANK()OVER( partition by id Order by id,[event],(SELECT NULL))
from @mytab
order by id,Sequence
我有一个数据集,我正在尝试对其应用二级排名,但不确定如何进行。
数据集看起来像:
ID Sequence Event
xxx 1
xxx 2 B
xxx 3 B
xxx 4 B
xxx 5 B
xxx 6 A
xxx 7
xxx 8 C
xxx 9 C
xxx 10 C
xxx 11 C
xxx 12 C
我尝试了一些 Ranking/Partitioning 组合,我得到的最接近的组合是:
DENSE_RANK() OVER (Partition BY ID ORDER BY ID, Event)
然而,当我这样做时,结果排名以无序的方式对事件进行排名,我知道它是按事件的字母顺序排列的:
ID Sequence Event Event Sequence
xxx 1 1
xxx 2 B 3
xxx 3 B 3
xxx 4 B 3
xxx 5 B 3
xxx 6 A 2
xxx 7 1
xxx 8 C 4
xxx 9 C 4
xxx 10 C 4
xxx 11 C 4
xxx 12 C 4
我试图将序列添加到排序方式中,但它不再按照我想要的方式对事件进行分组,而是简单地模拟序列系列。
我希望的是:
ID Sequence Event Event Sequence
xxx 1 1
xxx 2 B 2
xxx 3 B 2
xxx 4 B 2
xxx 5 B 2
xxx 6 A 3
xxx 7 1
xxx 8 C 4
xxx 9 C 4
xxx 10 C 4
xxx 11 C 4
xxx 12 C 4
这可能吗?
如果我没理解错的话,您可以使用 id
值中的最小值进行排序:
select t.*, dense_rank() over (order by min_sequence) as event_sequence
from (select t.*, min(sequence) over (partition by event) as min_sequence
from t
) t
order by t.id;
试试这个:
DECLARE @mytab table (id INT,Sequence INT, [Event] VARCHAR(1))
insert into @mytab
SELECT 1,1,''
union
SELECT 1,2,'B'
union
SELECT 1,3,'B'
union
SELECT 1,4,'B'
union
SELECT 1,5,'B'
union
SELECT 1,6,'A'
union
SELECT 1,7,''
union
SELECT 1,8,'C'
union
SELECT 1,9,'C'
union
SELECT 1,10,'C'
union
SELECT 1,11,'C'
union
SELECT 1,12,'C'
select *, DENSE_RANK()OVER( partition by id Order by id,[event],(SELECT NULL))
from @mytab
order by id,Sequence