我遇到了以下問題。使用 t-sql,從表中的以下示例資料開始:
| valid_from | 有效 | 文章 | 價錢 |
|---|---|---|---|
| 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 | 有效 | 文章 | 價錢 |
|---|---|---|---|
| 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 | 有效 | 文章 | 價錢 | 博士 |
|---|---|---|---|---|
| 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 組相同。你能幫我么?
uj5u.com熱心網友回復:
您可以使用 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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327934.html
