2

我收到來自多個天線的每日txt文件數據。對於文件的命名約定是:查找數據中缺失的日期

獨特的天線ID +年+月+日+隨機3位數字

我解析的文件名和創建的表像這樣的:

AntennaID fileyear filemonth fileday filenumber  filename 
0000   2016  09   22   459   000020160922459.txt 
0000   2016  09   21   981   000020160921981.txt 
0000   2016  09   20   762   000020160920762.txt 
0001   2016  09   22   635   000120160922635.txt 
. 
. 
. 
etc. (200k rows) 

有時候,天線根本不會發送超過1個文件或沒有文件。唯一的3位數filenumber區分文件,如果超過1發送,但我試圖找到一個文件沒有發送的日子。

我試了幾次groupby語句來比較給定月份中的數據文件數量,並查看它是否與當月的日期相匹配 - 但問題是有時天線每次發送超過1個文件如果我們只是比較計數,那麼可以人爲地彌補「缺失」文件。

我正在尋找一種更強大的方法來查找丟失文件的日期或日期範圍。我已經研究了分區和重疊函數,並感覺這裏可能有潛力,但我不確定如何使用它們,因爲我對SQL相當陌生。

我使用Microsoft SQL Server 2016

+0

這是什麼叫做「缺口另一個例子,島嶼「問題。你可以谷歌這個詞來解決很多問題。 –

回答

5

可以使用common table expression(或簡稱cte)創建的日期表。您可以從該表到你的天線數據,那麼join能並查找返回null值日期:

declare @MinDate date = getdate()-50 
declare @MaxDate date = getdate() 

;with Dates as 
(
select @MinDate as DateValue 

union all 

select dateadd(d,1,DateValue) 
from Dates 
where DateValue < @MaxDate 
) 
select d.DateValue 
from Dates d 
    left join AntennaData a 
     on(d.DateValue = cast(cast(a.fileyear as nvarchar(4)) + cast(a.filemonth as nvarchar(4)) + cast(a.fileday as nvarchar(4)) as date)) 
option (maxrecursion 0) 
+1

我的投票把你的聲望超過1000.你欠我一杯啤酒。 –

+1

@DanBracuk誘惑你的歷史並對9件事進行投票,讓你達到15k ... – iamdave

1

您可以使用NOT EXISTS

DECLARE @BeginDate DATE, @EndDate DATE; 
SET @BeginDate = '20160101'; 
SET @EndDate = '20160922'; 

WITH Dates AS 
(
    SELECT DATEADD(DAY,number,@BeginDate) [Date] 
    FROM master.dbo.spt_values 
    WHERE type = 'P' 
    AND DATEADD(DAY,number,@BeginDate) <= @EndDate 
) 
SELECT * 
FROM Dates A 
WHERE NOT EXISTS(SELECT 1 FROM dbo.Antenna 
       WHERE SUBSTRING([filename],5,8) = A.[Date]);