【问题标题】:Serial Number in logical order without gaps序列号按逻辑顺序排列,无间隙
【发布时间】:2020-04-02 17:37:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: tsql sql-order-by rank partition


    【解决方案1】:

    您需要改用DENSE_RANK

    此函数返回结果集分区内每一行的排名,排名值没有间隙

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

    另外,ORDER BY 中的 Client 无效,因为每个分区的值相同。

    【讨论】:

    • 哇,就这么简单,谢谢。啊,我不知道订单,谢谢提示
    • 很高兴您找到了有用的答案。请考虑通过单击左侧的灰色复选标记来接受答案。它会奖励回答的人一些声望点,你也会得到一些。
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多