SQL公式行号
我想下面的表格看起来像这样在排名中的行:SQL公式行号
| ID | Key | Date | Row|
*****************************
| P175 | 5 | 2017-01| 2 |
| P175 | 5 | 2017-02| 2 |
| P175 | 5 | 2017-03| 2 |
| P175 | 12 | 2017-03| 1 |
| P175 | 12 | 2017-04| 1 |
| P175 | 12 | 2017-05| 1 |
这个人有一次两个按键期间2017-03,但我希望公式因为它反映了最近的记录,所以对于Key = 12的行放置'1'。
我想同样的公式也为谁没有重叠键广大人民群众一道,把“1”,最近的记录:
| ID | Key | Date | Row|
*****************************
| P170 | 8 | 2017-01| 2 |
| P170 | 8 | 2017-02| 2 |
| P170 | 8 | 2017-03| 2 |
| P170 | 6 | 2017-04| 1 |
| P170 | 6 | 2017-05| 1 |
我试过ROW_NUMBER的变化()OVER PARTITION BY和DENSE_RANK,但无法找出正确的公式。谢谢你的帮助。
首先计算密钥的最大日期。然后使用dense_rank()
:
select t.*,
dense_rank() over (partition by id order by max_date desc, key) as row
from (select t.*, max(date) over (partition by id, key) as max_date
from t
) t;
如果每个键的范围没有重叠,你可以用累积计数明显这样做:
select t.*, count(distinct key) over (partition by id order by date desc) as rank
from t;
但是,这不会在第一种情况下工作。我觉得这很有趣,它和第一个查询几乎完全相同。
我试过这个,它适用于一些但不是全部记录 - 如果一个人有两个键在同一时间最近的日期也是相同的,他们都显示为1.在在这种情况下,哪个密钥会获得1或2,因为它们都是最新的。你知道这个方法吗?谢谢。 –
@Joyce。 。 。这应该很容易解决。只需在'order by'中添加'key'作为最后一列。 –
我猜你正在寻找这样的事情
select personid, mykey, month,
dense_rank() over (partition by personid order by mykey desc) rown
from personkeys
order by month
看到
乌尔样本数据是混淆.... – Teja
您使用该RDBMS的例子吗? –
@MigsIsip我正在使用ssms –