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,但无法找出正确的公式。谢谢你的帮助。

+0

乌尔样本数据是混淆.... – Teja

+0

您使用该RDBMS的例子吗? –

+0

@MigsIsip我正在使用ssms –

首先计算密钥的最大日期。然后使用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; 

但是,这不会在第一种情况下工作。我觉得这很有趣,它和第一个查询几乎完全相同。

+0

我试过这个,它适用于一些但不是全部记录 - 如果一个人有两个键在同一时间最近的日期也是相同的,他们都显示为1.在在这种情况下,哪个密钥会获得1或2,因为它们都是最新的。你知道这个方法吗?谢谢。 –

+0

@Joyce。 。 。这应该很容易解决。只需在'order by'中添加'key'作为最后一列。 –

我猜你正在寻找这样的事情

select personid, mykey, month, 
     dense_rank() over (partition by personid order by mykey desc) rown 
from personkeys 
order by month 

看到

http://sqlfiddle.com/#!15/cf751/8