计算排名并按照订单应用

Calculate the rank and apply it following an order

我想按子句计算组的密集排名,并按照行 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

看来您只需要将 prop3 的方向从升序更改为降序即可:

WITH VTE AS(
    SELECT *
    FROM (VALUES (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)) V(id, rang, prop1, prop2, prop3, prop4))
SELECT VTE.id,
       VTE.rang,
       VTE.prop1,
       VTE.prop2,
       VTE.prop3,
       VTE.prop4,
       DENSE_RANK() OVER (ORDER BY prop1, prop2, prop3 DESC, prop4) AS Ranking
FROM VTE;

如果我理解正确,那么您首先需要找到每个 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