【发布时间】:2021-10-23 20:48:14
【问题描述】:
在以下情况下,我很难理解如何应用 DENSE_RANK() 来获得我想要的结果:
| ID | Date | Value |
|---|---|---|
| 1 | 1990-05-17 | 1.00 |
| 1 | 1991-10-12 | 1.00 |
| 1 | 1992-08-01 | 1.00 |
| 1 | 1993-07-05 | 0.67 |
| 1 | 1994-05-02 | 0.67 |
| 1 | 1995-02-01 | 1.00 |
| 1 | 1996-03-01 | 1.00 |
基于上述数据,我尝试使用Date 和Value 列的组合来识别不同的时期,其中一个独特的时期是从Value 列从一个值更改为另一个值的位置确定的.这是我正在寻找的结果:
| ID | Date | Value | Period |
|---|---|---|---|
| 1 | 1990-05-17 | 1.00 | 1 |
| 1 | 1991-10-12 | 1.00 | 1 |
| 1 | 1992-08-01 | 1.00 | 1 |
| 1 | 1993-07-05 | 0.67 | 2 |
| 1 | 1994-05-02 | 0.67 | 2 |
| 1 | 1995-02-01 | 1.00 | 3 |
| 1 | 1996-03-01 | 1.00 | 3 |
如您所见,有 3 个不同的时期。我遇到的问题是,当我使用DENSE_RANK() 时,我会得到以下两种结果之一:
SELECT DENSE_RANK() OVER (PARTITION BY ID ORDER BY Date, Value)
| ID | Date | Value | Period |
|---|---|---|---|
| 1 | 1990-05-17 | 1.00 | 1 |
| 1 | 1991-10-12 | 1.00 | 2 |
| 1 | 1992-08-01 | 1.00 | 3 |
| 1 | 1993-07-05 | 0.67 | 4 |
| 1 | 1994-05-02 | 0.67 | 5 |
| 1 | 1995-02-01 | 1.00 | 6 |
| 1 | 1996-03-01 | 1.00 | 7 |
SELECT DENSE_RANK() OVER (PARTITION BY ID ORDER BY Value)
| ID | Date | Value | Period |
|---|---|---|---|
| 1 | 1990-05-17 | 1.00 | 1 |
| 1 | 1991-10-12 | 1.00 | 1 |
| 1 | 1992-08-01 | 1.00 | 1 |
| 1 | 1993-07-05 | 0.67 | 2 |
| 1 | 1994-05-02 | 0.67 | 2 |
| 1 | 1995-02-01 | 1.00 | 1 |
| 1 | 1996-03-01 | 1.00 | 1 |
如您所见,问题在于Date 列,因为我需要将其作为累积期。此外,句号的数量从ID 到ID 不等,Date 列背后没有一致的科学依据。例如,一个成员在一年内可能有两个条目。
【问题讨论】:
标签: sql-server sum window-functions dense-rank