【发布时间】:2020-03-15 14:36:25
【问题描述】:
架构:
简化 - 一个列出 ID 号、版本和状态的表格:
CREATE TABLE archive
([id] int, [version] int, [status] varchar(1));
INSERT INTO archive
([id], [version], [status])
VALUES
(1, 1, 'A'),
(1, 2, 'S'),
(1, 3, 'T'),
(1, 4, 'A'),
(2, 2, 'T'),
(2, 4, 'T'),
(3, 1, 'A'),
(3, 3, 'A');
问题:
一些记录缺少完整的历史记录(版本)。所有 ID 都应该以版本 1 开头,并且版本号应该是连续的(与上述架构中的 ID 2 和 3 不同)。
想要的输出
所有 ID 的列表,显示其现有版本以及“跳过”的版本。根据下面的示例,输出应如下所示:
id | ver | check
---+-----+------
1| 1 | 1
1| 2 | 2
1| 3 | 3
1| 4 | 4
2| NULL| 1
2| 2 | 2
2| NULL| 3
2| 4 | 4
3| 1 | 1
3| NULL| 2
3| 3 | 3
我目前的努力:
问题与this one 类似,但没有固定的“Table2”,如已回答的问题。每条记录的版本数未知。
到目前为止,我想出了以下几点:
SELECT sub.id, sub.ver, sub.seq
FROM (
SELECT CASE WHEN a.id IS NULL THEN b.id ELSE a.id END as 'id', b.version as 'ver', a.seq as 'seq'
FROM (select *,
row_number() over (partition by id order by version asc) as seq
from archive) a
FULL OUTER JOIN archive b ON a.id=b.id AND a.seq=b.version) sub
ORDER BY sub.id, sub.ver, sub.seq
下面的输出让我几乎到了那里:
任何帮助将不胜感激。
【问题讨论】:
-
看到这样一个写得很好的问题多么令人耳目一新:)
标签: sql sql-server tsql