我想计算group by子句的密集排名,并按行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个用于排名的属性,它们对排序没有用
在我的情况下,我希望ID = 124834、124835、124836的rang = 1,ID 124837、124838、124839的rang = 2
答案 0 :(得分:3)
如果我理解正确,那么您首先需要找到每个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
答案 1 :(得分:1)
似乎您只需要将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;