SQL 行号公式

SQL formula for Row number

我正在尝试对以下 table 中的行进行排名,如下所示:

| 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 期间同时有两个键,但我希望公式为键 = 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;

但是,这在第一种情况下是行不通的。我只是觉得有趣的是,这与第一个查询几乎相同。

我猜你正在寻找这样的东西

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