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
查看示例
我正在尝试对以下 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
查看示例