【问题标题】:Group by consecutive dates in TSQL在 SQL 中按连续日期分组
【发布时间】:2021-12-06 14:55:41
【问题描述】:

我遇到以下问题。使用t-sql,从表中的以下示例数据开始:

valid_from valid_to article price
2021-01-01 2021-01-02 AAA 10,99
2021-01-02 2021-01-03 AAA 10,99
2021-01-03 2021-01-05 AAA 10,99
2021-01-05 2021-01-06 AAA 12,99
2021-01-06 2021-01-09 AAA 12,99
2021-01-09 2021-01-14 AAA 10,99
2021-01-14 2021-01-15 AAA 10,99
2021-01-15 2021-01-16 AAA 10,99

我必须生成“汇总”数据表,在价格保持不变的情况下折叠连续几天的数据,并只生成由最小的 valid_from 和最大的 valid_to 组成的一行。在这种情况下,所需的输出将是:

valid_from valid_to article price
2021-01-01 2021-01-05 AAA 10,99
2021-01-05 2021-01-09 AAA 12,99
2021-01-09 2021-01-16 AAA 10,99

我尝试了一些查询,但找不到完全解决问题的方法。

DECLARE @TBL_DATA AS TABLE (
    valid_from DATE NOT NULL,
    valid_to DATE NOT NULL,
    article VARCHAR(20) NOT NULL,
    price FLOAT NOT NULL
)

INSERT INTO @TBL_DATA (
    valid_from,
    valid_to,
    article,
    price
)
VALUES
('2021-01-01','2021-01-02','AAA',10.99),
('2021-01-02','2021-01-03','AAA',10.99),
('2021-01-03','2021-01-05','AAA',10.99),
('2021-01-05','2021-01-06','AAA',12.99),
('2021-01-06','2021-01-09','AAA',12.99),
('2021-01-09','2021-01-14','AAA',10.99),
('2021-01-14','2021-01-15','AAA',10.99),
('2021-01-15','2021-01-16','AAA',10.99)

SELECT
    td.*,
    DENSE_RANK() OVER (ORDER BY td.article ASC, td.price ASC) AS dr
FROM @TBL_DATA AS td
WHERE 1 = 1
ORDER BY
    td.valid_from ASC
valid_from valid_to article price dr
2021-01-01 2021-01-02 AAA 10.99 1
2021-01-02 2021-01-03 AAA 10.99 1
2021-01-03 2021-01-05 AAA 10.99 1
2021-01-05 2021-01-06 AAA 12.99 2
2021-01-06 2021-01-09 AAA 12.99 2
2021-01-09 2021-01-14 AAA 10.99 1
2021-01-14 2021-01-15 AAA 10.99 1
2021-01-15 2021-01-16 AAA 10.99 1

作为中间步骤,我按文章和价格计算 DENSE_RANK 排序,但第 3 组(按价格)获得与第 1 组相同的排名。你能帮帮我吗?

【问题讨论】:

    标签: sql date tsql group-by


    【解决方案1】:

    您可以使用 rank 或 row_number 窗口函数来查找islands & gaps

    select min(valid_from) valid_from, max(valid_to) valid_to, article, price
    from (
       select * 
            , rank() over (partition by article order by valid_from) 
            - rank() over (partition by article,price order by valid_from) groups
       from TBL_DATA) t
    group by groups , price, article
    order by min(valid_from)
    

    db小提琴here

    【讨论】:

    • 谢谢你,eshirvana。效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2020-05-23
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多