【问题标题】:SQL Ranking on existing sequence?现有序列的 SQL 排名?
【发布时间】:2018-09-14 11:49:12
【问题描述】:

我有一个数据集,我正在尝试对其应用二级排名,但不确定如何去做。

数据集如下:

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

我尝试了一些排名/分区组合,我得到的最接近的是:

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     

我尝试将序列添加到 Order by 中,但它不再按照我想要的方式对事件进行分组,而是简单地模拟序列系列。

我希望是这样的:

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

这可能吗?

【问题讨论】:

    标签: sql sql-server ranking rank


    【解决方案1】:

    如果我理解正确,您可以使用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;
    

    【讨论】:

    • 这看起来可行。我没有想到使用子查询来减少事件。谢谢!
    【解决方案2】:

    试试这个:

       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
    

    【讨论】:

    • 我认为这与我第一次尝试的结果相同,事件“b”显示为序列事件 3,事件“a”显示为序列 2。我认为没有按序列排序在 ORDER BY 中,它按 Event 的字母顺序进行。
    猜你喜欢
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2017-05-07
    • 2021-01-31
    • 2011-07-26
    • 1970-01-01
    • 2017-10-14
    • 2011-01-04
    相关资源
    最近更新 更多