SQL Server 中如何处理序列?

问题描述

我在 sql Server 中有一个问题处理序列。

我想得到 result01。

这是示例表。

CREATE TABLE temp01
(
    SEQ         int,cat01       numeric(6,0),cat02       numeric(6,dt_day      date,dt_week     date,dt_month    date,price       decimal(10,0)
)

INSERT INTO temp01 VALUES (1,230,1,'2019-01-01','2019-01-05','2019-01-31',16000)
INSERT INTO temp01 VALUES (2,'2019-01-02',NULL)
INSERT INTO temp01 VALUES (3,'2019-01-03',13000)
INSERT INTO temp01 VALUES (4,'2019-01-04',NULL)
INSERT INTO temp01 VALUES (5,'2019-01-12',NULL)
INSERT INTO temp01 VALUES (6,'2019-01-06',NULL)
INSERT INTO temp01 VALUES (7,'2019-01-07',19000)
INSERT INTO temp01 VALUES (1,2,NULL)
INSERT INTO temp01 VALUES (2,12000)
INSERT INTO temp01 VALUES (4,17000)
INSERT INTO temp01 VALUES (5,22000)
INSERT INTO temp01 VALUES (6,' 2019-01-06',' 2019-01-07',21000)

我想从 temp01 获取这张表。

[result01]

    | SEQ | cat01 | cat02 |   dt_day   | price | sub_seq |
    | --- | ----- | ----- | ---------- | ----- | ------- |
    |  1  |  230  |   1   | 2019-01-01 | 16000 |    1    |
    |  3  |  230  |   1   | 2019-01-03 | 13000 |    2    |
    |  7  |  230  |   1   | 2019-01-07 | 19000 |    3    |
    |  3  |  230  |   2   | 2019-01-03 | 12000 |    1    |
    |  4  |  230  |   2   | 2019-01-04 | 17000 |    2    |    
    |  5  |  230  |   2   | 2019-01-05 | 22000 |    3    | 
    |  7  |  230  |   2   | 2019-01-07 | 21000 |    4    |

....

所以,我使用这个代码。我认为这段代码不正确。

WITH ROW_VALUE AS
(
    SELECT SEQ,dt_day,cat01,cat02,price,ROW_NUMBER() OVER (ORDER BY cat01,dt_day) AS sub_seq
    FROM (
        SELECT SEQ,dt_week,dt_month,price
        FROM temp01
        WHERE price IS NOT NULL
            )val
)
SELECT disTINCT *
FROM ROW_VALUE
ORDER BY cat01,dt_day

如何获得 result01 表?

请检查我的代码

解决方法

你应该PARTITION BY cat01,cat02ORDER BY dt_day

SELECT SEQ,cat01,cat02,dt_day,dt_week,dt_month,price,ROW_NUMBER() OVER (PARTITION BY cat01,cat02 ORDER BY dt_day) AS sub_seq
FROM temp01
WHERE price IS NOT NULL

参见demo
结果:

序列 cat01 cat02 dt_day dt_week dt_month 价格 sub_seq
1 230 1 2019-01-01 2019-01-05 2019-01-31 16000 1
3 230 1 2019-01-03 2019-01-05 2019-01-31 13000 2
7 230 1 2019-01-07 2019-01-12 2019-01-31 19000 3
3 230 2 2019-01-03 2019-01-12 2019-01-31 12000 1
4 230 2 2019-01-04 2019-01-12 2019-01-31 17000 2
5 230 2 2019-01-05 2019-01-12 2019-01-31 22000 3
7 230 2 2019-01-07 2019-01-12 2019-01-31 21000 4