按逻辑顺序的序列号,没有空格

问题描述 投票:0回答:1

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

+--------+------------+------------+---------+--------+
| 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。anayone可以帮助我按此顺序生成它吗?预先感谢!

Extra除了昨天的问题外,我还需要做其他事情。因为当我的Start_Date相同时Ser_No必须相同,但是当我的后续记录是同一产品时(也就是它具有不同的Start_Date时)Ser_No也必须相同。

所以我期望什么,我现在得到什么:

+--------+------------+------------+---------+--------+------------+
| 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     |
+--------+------------+------------+---------+--------+------------+

关于如何实现这一目标的任何想法,因为我不明白

tsql sql-order-by rank partition
1个回答
3
投票

您需要改用DENSE_RANK

此函数返回结果集分区中每一行的排名,无间隔的排名值。

DENSE_RANK

另外,DENSE_RANK() OVER(PARTITION BY Client ORDER BY Start_date) AS Ser_no 中的Client没有效果,因为每个分区的值相同。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.