【发布时间】: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 组相同的排名。你能帮帮我吗?
【问题讨论】: