sql - 计算排名并按照顺序应用
问题描述
我想计算一个 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
解决方案
如果我理解正确,那么您首先需要找到每个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
推荐阅读
- java - 无法使用 domainCreateXML 或 domainDefineXML 函数在 java 中创建新域
- ubuntu - 从 Ubuntu WSL 查找活动 COM 端口(或从 bash 探测设备注册表)
- c++ - 赋值运算符给出“没有合适的用户定义转换”错误
- c# - 如何快速插入给定间隔的日期时间?
- python - 设置成员变量抛出错误'NoneType'类型的参数不可迭代'
- c# - 我想出112233..增加号码,我该怎么办?
- python-3.x - 在 python 3 的打印输出中添加一个冒号
- python - 如何在 Tensorflow 2.0 中保存在 GPU 上训练并加载到 CPU 上的模型
- javascript - 在这种情况下,您如何正确地从 reducer/actions 调用函数?
- ruby-on-rails - 使用 sidekiq 一年后删除日志数据