シーケンスで欠落しているエントリを見つける秘訣は、シーケンスで使用可能なすべての組み合わせのデカルト積を生成し、それを使用NOT EXISTS
して存在するものを削除することです。これは、DBMS固有ではない方法で行うのは困難です。これは、シーケンスをオンザフライで最適に作成する方法がすべて異なるためです。Oracleの場合、私は以下を使用します。
SELECT RowNum AS r
FROM Dual
CONNECT BY Level <= MaxRequiredValue;
したがって、使用可能なすべての年/ 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フィドルの実例
編集
DMBS固有ではないソリューションが見つからなかったので、まともなことをして、他のDBMSの例をいくつか作成したほうがいいと思いました。
SQLServerの例
Postgresqlの例
私のSQLの例