序列号按逻辑顺序排列,无间隙

Serial Number in logical order without gaps

我正在尝试根据一些条件生成序列号。 我的数据集:

+--------+------------+------------+---------+--------+
| Client | Start_Date |  End_date  | Product | Ser_No |
+--------+------------+------------+---------+--------+
|   44   | 22-01-2018 | 31-12-2018 |    A    |        |
+--------+------------+------------+---------+--------+
|   44   | 24-02-2018 | 01-01-2019 |    B    |        |
+--------+------------+------------+---------+--------+
|   44   | 12-03-2018 | 01-01-2019 |    C    |        |
+--------+------------+------------+---------+--------+
|   100  | 24-01-2018 | 30-11-2018 |    A    |        |
+--------+------------+------------+---------+--------+
|   100  | 26-01-2018 | 15-12-2018 |    D    |        |
+--------+------------+------------+---------+--------+
|   100  | 26-01-2018 | 01-02-2019 |    E    |        |
+--------+------------+------------+---------+--------+
|   100  | 01-03-2018 | 31-01-2019 |    F    |        |
+--------+------------+------------+---------+--------+

我对序列号所做的配置:

RANK() OVER(PARTITION BY Client ORDER BY Client, Start_date ASC)

现在它为我生成一个序列号,如下所示:

+--------+------------+------------+---------+--------+
| Client | Start_Date |  End_date  | Product | Ser_No |
+--------+------------+------------+---------+--------+
|   44   | 22-01-2018 | 31-12-2018 |    A    |    1   |
+--------+------------+------------+---------+--------+
|   44   | 24-02-2018 | 01-01-2019 |    B    |    2   |
+--------+------------+------------+---------+--------+
|   44   | 12-03-2018 | 01-01-2019 |    C    |    3   |
+--------+------------+------------+---------+--------+
|   100  | 24-01-2018 | 30-11-2018 |    A    |    1   |
+--------+------------+------------+---------+--------+
|   100  | 26-01-2018 | 15-12-2018 |    D    |    2   |
+--------+------------+------------+---------+--------+
|   100  | 26-01-2018 | 01-02-2019 |    E    |    2   |
+--------+------------+------------+---------+--------+
|   100  | 01-03-2018 | 31-01-2019 |    F    |    4   |
+--------+------------+------------+---------+--------+

我的分析出了问题的是最后一行,它生成了序列号。它必须是3。 谁能帮我按这个顺序生成它? 提前致谢!

额外 除了我昨天的问题之外,我还需要做一些额外的事情。因为当我的 Start_Date 相同时 Ser_No 必须相同,但是当我的以下记录是相同的产品时 Ser_No 也相同(当它有不同的时候Start_Date)

所以我所期待的和我现在得到的:

+--------+------------+------------+---------+--------+------------+
| Client | Start_Date |  End_date  | Product | Ser_No | Ser_No New |
+--------+------------+------------+---------+--------+------------+
|   44   | 22-01-2018 | 31-12-2018 |    A    |    1   |      1     |
+--------+------------+------------+---------+--------+------------+
|   44   | 24-02-2018 | 01-01-2019 |    B    |    2   |      2     |
+--------+------------+------------+---------+--------+------------+
|   44   | 12-03-2018 | 01-01-2019 |    C    |    2   |      2     |
+--------+------------+------------+---------+--------+------------+
|   100  | 24-01-2018 | 30-11-2018 |    A    |    1   |      1     |
+--------+------------+------------+---------+--------+------------+
|   100  | 26-01-2018 | 15-12-2018 |    D    |    2   |      2     |
+--------+------------+------------+---------+--------+------------+
|   100  | 26-01-2018 | 01-02-2019 |    E    |    2   |      2     |
+--------+------------+------------+---------+--------+------------+
|   100  | 01-03-2018 | 31-01-2019 |    F    |    3   |      3     |
+--------+------------+------------+---------+--------+------------+
|   100  | 11-04-2018 | 31-03-2019 |    F    |    4   |      3     |
+--------+------------+------------+---------+--------+------------+
|   100  | 20-04-2018 | 31-01-2019 |    G    |    5   |      4     |
+--------+------------+------------+---------+--------+------------+
|   100  | 21-04-2018 | 31-01-2019 |    A    |    6   |      5     |
+--------+------------+------------+---------+--------+------------+
|   100  | 21-04-2018 | 31-01-2019 |    B    |    6   |      5     |
+--------+------------+------------+---------+--------+------------+
|   100  | 01-05-2018 | 31-01-2019 |    B    |    7   |      5     |
+--------+------------+------------+---------+--------+------------+

关于如何实现这个的任何想法,因为我不会得到它

您需要使用 DENSE_RANK 来代替:

This function returns the rank of each row within a result set partition, with no gaps in the ranking values.

DENSE_RANK() OVER(PARTITION BY Client ORDER BY Start_date) AS Ser_no

此外,ORDER BY 中的 Client 没有任何效果,因为它在每个分区中具有相同的值。