首页 > 解决方案 > 计算排名并按照顺序应用

问题描述

我想计算一个 group by 子句的密集排名,并按照我的 line id 的顺序设置我的排名,即最小的 id 获得第一名,依此类推。

我能够检索我的行的密集等级,但应用等级的等级不是我想要的顺序。样本数据:

id          rang                 prop1       prop2        prop3     prop4                          
----------- -------------------- ----------- ----------- --------- -----
1244834     2                    609         96          0,02       0,00           
1244835     2                    609         96          0,02       0,00           
1244836     2                    609         96          0,02       0,00           
1244837     1                    609         96          0,00       0,01           
1244838     1                    609         96          0,00       0,01           
1244839     1                    609         96          0,00       0,01           

我的要求如下:

select id,
       DENSE_RANK() over (order by prop1, prop2, prop3, prop4) rang
       prop1,
       prop2,
       prop3,
       prop4,
from mytable
where ...
order by id

我希望按照我的 id 列顺序应用计算的排名,知道 id 是连续的。

我的真实数据还有 15 个用于排名的属性,它们对排序没有用处

在我的情况下,我希望 rang = 1 用于 id 124834、124835、124836 和 rang = 2 用于 id 124837、124838、124839

标签: sqlsql-serverwindow-functionsdense-rank

解决方案


如果我理解正确,那么您首先需要找到每个prop1, prop2, prop3, prop4组的最小 id 并计算排名:

WITH cte AS (
    SELECT *, MIN(id) OVER (PARTITION BY prop1, prop2, prop3, prop4) AS min_id
    FROM (VALUES
        (1244834, 609, 96, 0.02, 0.00),
        (1244835, 609, 96, 0.02, 0.00),
        (1244836, 609, 96, 0.02, 0.00),
        (1244837, 609, 96, 0.00, 0.01),
        (1244838, 609, 96, 0.00, 0.01),
        (1244839, 609, 96, 0.00, 0.01)
    ) t(id, prop1, prop2, prop3, prop4)
)
SELECT *, DENSE_RANK() OVER (ORDER BY min_id) AS rnk
FROM cte
ORDER BY rnk, id

推荐阅读