あなたの説明に一致するようにテストテーブルを作成し、次のように各行の間に1分で100行を挿入しました。
CREATE TABLE [Test] ([Id] int IDENTITY(1,1), [Date] datetime, [Price] int);
WITH [Tally] AS (
SELECT GETDATE() AS [Date]
UNION ALL
SELECT DATEADD(minute, -1, [Date]) FROM [Tally] WHERE [Date] > DATEADD(minute, -99, GETDATE())
)
INSERT INTO [Test] ([Date], [Price])
SELECT [Date], 123 AS [Price]
FROM [Tally]
次に、行方不明の分をシミュレートするために途中でレコードを削除しました。
DELETE FROM [Test]
WHERE Id = 50
これで、このクエリを使用して欠落しているレコードを見つけることができます。
SELECT
a.*
,CASE WHEN b.[Id] IS NULL THEN 'Next record is Missing!' ELSE CAST(b.[Id] as varchar) END AS NextId
FROM
[Test] AS a
LEFT JOIN [Test] AS b ON a.[Date] = DATEADD(minute,1,b.[Date])
WHERE
b.[Id] IS NULL
結果は次のようになります。
Id Date Price NextId
----------- ----------------------- ----------- ------------------------------
49 2013-05-11 22:42:56.440 123 Next record is Missing!
100 2013-05-11 21:51:56.440 123 Next record is Missing!
(2 row(s) affected)
この問題の重要な解決策は、テーブルをそれ自体と結合することですが、datediff を使用して、次の分に見つかるはずのレコードを見つけます。もちろん、テーブルの最後のレコードは、まだ挿入されていないため、次の行がないことを報告します。