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