【问题标题】:How to deal with sequence in SQL Server?如何处理 SQL Server 中的序列?
【发布时间】:2021-06-11 08:03:38
【问题描述】:

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

我想得到 result01。

这是示例表。

CREATE TABLE temp01
(
    SEQ         int,
    cat01       numeric(6,0),
    cat02       numeric(6,0),
    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, 230, 1, '2019-01-02', '2019-01-05', '2019-01-31', NULL)
INSERT INTO temp01 VALUES (3, 230, 1, '2019-01-03', '2019-01-05', '2019-01-31', 13000)
INSERT INTO temp01 VALUES (4, 230, 1, '2019-01-04', '2019-01-05', '2019-01-31', NULL)
INSERT INTO temp01 VALUES (5, 230, 1, '2019-01-05', '2019-01-12', '2019-01-31', NULL)
INSERT INTO temp01 VALUES (6, 230, 1, '2019-01-06', '2019-01-12', '2019-01-31', NULL)
INSERT INTO temp01 VALUES (7, 230, 1, '2019-01-07', '2019-01-12', '2019-01-31', 19000)
INSERT INTO temp01 VALUES (1, 230, 2, '2019-01-01', '2019-01-05', '2019-01-31', NULL)
INSERT INTO temp01 VALUES (2, 230, 2, '2019-01-02', '2019-01-05', '2019-01-31', NULL)
INSERT INTO temp01 VALUES (3, 230, 2, '2019-01-03', '2019-01-12', '2019-01-31', 12000)
INSERT INTO temp01 VALUES (4, 230, 2, '2019-01-04', '2019-01-12', '2019-01-31', 17000)
INSERT INTO temp01 VALUES (5, 230, 2, '2019-01-05', '2019-01-12', '2019-01-31', 22000)
INSERT INTO temp01 VALUES (6, 230, 2,' 2019-01-06', '2019-01-12', '2019-01-31', NULL)
INSERT INTO temp01 VALUES (7, 230, 2,' 2019-01-07', '2019-01-12', '2019-01-31', 21000)

我想从 temp01 获取这张表。

[结果01]

    | 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, cat02, dt_day) AS sub_seq
    FROM (
        SELECT SEQ
            , cat01
            , cat02
            , dt_day
            , dt_week
            , dt_month
            , price
        FROM temp01
        WHERE price IS NOT NULL
            )val
)
SELECT DISTINCT *
FROM ROW_VALUE
ORDER BY cat01, cat02, dt_day

如何获得 result01 表?

请检查我的代码。

【问题讨论】:

  • 但是,它无法提取结果01 - ??请澄清。另外,如果这个sqlserver请删除mysql标签
  • 请说明您要实现的逻辑。这真的不是很明显:“我想知道从重复值中提取子序列。”。
  • @P.Salmon 对不起。我想得到 result01 表。我认为这段代码不正确。
  • @GordonLinoff 是的,我想得到 result01 表。

标签: sql sql-server window-functions row-number


【解决方案1】:

你应该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
结果:

SEQ cat01 cat02 dt_day dt_week dt_month price 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

【讨论】:

  • 非常感谢。
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2014-06-08
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多