在序列中查找缺失条目的技巧是生成序列中所有可用组合的笛卡尔积,然后用于NOT EXISTS
消除那些存在的组合。这很难以非 DBMS 特定的方式完成,因为它们都有不同的方式来优化动态创建序列。对于 Oracle,我使用:
SELECT RowNum AS r
FROM Dual
CONNECT BY Level <= MaxRequiredValue;
因此,要生成所有可用 year/n 对的列表,我将使用:
SELECT d.Year, n.r
FROM ( SELECT year, MAX(n) AS MaxN
FROM T
GROUP BY Year
) d
INNER JOIN
( SELECT RowNum AS r
FROM Dual
CONNECT BY Level <= (SELECT MAX(n) FROM T)
) n
ON r < MaxN;
我得到每年的最大值 n 并将其加入从 1 到最高 n 的整数列表中,其中该整数列出的最大值小于该年份的最大值。
最后用于NOT EXISTS
消除已经存在的值:
SELECT d.Year, n.r
FROM ( SELECT year, MAX(n) AS MaxN
FROM T
GROUP BY Year
) d
INNER JOIN
( SELECT RowNum AS r
FROM Dual
CONNECT BY Level < (SELECT MAX(n) FROM T)
) n
ON r = MaxN
WHERE NOT EXISTS
( SELECT 1
FROM T
WHERE d.Year = t.Year
AND n.r = t.n
);
SQL Fiddle上的工作示例
编辑
由于我找不到非 DMBS 特定的解决方案,我想我最好做点正经的事,并为其他 DBMS 创建一些示例。
SQL Server 示例
PostgreSQL 示例
我的 SQL 示例