2016-08-02 55 views
0

我有一個如下的SQL語句,我希望以分鐘爲單位檢查數據,其中D.DatalogValue沒有任何值,它不會顯示爲空值或零值無論是。下面的輸出結果示例將顯示爲2016-06-01 00:32:29爲缺少createdDate。在幾分鐘內檢查SQL中的丟失時間間隔

SELECT 
    A.DefID, A.ObjID, 
    C.ObjName, C.Dev_ID, 
    A.Pro_ID, A.ArrayIndex, 
    A.DefType, A.TObjID, A.DimeId, A.DefId, 
    D.DatalogValue, D.PanelDt, D.CreatedDate 
FROM 
    Table A, Table C, Table D 
WHERE 
    A.ObjID = C.ObjID 
    AND C.ObjID = '2627' 
    AND A.DefID = D.DefID 
    AND D.CreatedDate BETWEEN '2016-06-01' AND '2016-06-02' 
ORDER BY 
    C.ObID,C.ObjName; 

的樣本數據:

Create Date    DatalogValue 
------------------------------------- 
2016-06-01 00:29:29  0.01 
2016-06-01 00:30:29  0.02 
2016-06-01 00:31:29  0.03 

2016-06-01 00:33:29  0.04 

通過使用所提供的解決方案,我已經走出了一條SQL語句,但它仍然沒有能夠表現出我想要的結果。我不知道我在做這部分錯我的代碼如下:

DECLARE @StartDate DATETIME = '2016-07-01'; 
DECLARE @EndDate DATETIME = '2016-07-31'; 

WITH Check_Dates AS (
SELECT @StartDate [Date] 
UNION ALL 
SELECT DATEADD(MINUTE, 1, [Date]) FROM Check_Dates 
WHERE [Date] < DATEADD(DAY, 1, @EndDate) 
) 

SELECT 
FORMAT(d.Date, 'yyyy-MM-dd HH:mm') [Created Date] 

FROM Check_Dates d 
WHERE 
NOT EXISTS(
SELECT 
Format(D.CreatedDate, 'yyyy-MM-dd HH:mm')as created_dt 

FROM TABLE A 
,TABLE C 
,TABLE D 
WHERE A.ObjID=C.ObjID 
AND C.ObjID IN('3915') 
AND A.DefID=D.DefID 
AND D.CreatedDate BETWEEN '2016-07-01' AND '2016-08-01' 
) 

OPTION (MAXRECURSION 0); 
+1

無論你需要一個'outer join'還是一個'outer'表都帶有'outer join' - 難以說沒有樣本數據和預期的結果(以及可能的表結構)。 – sgeddes

+0

@sgeddes您好我重新編輯我的文章樣本數據,因爲我面臨的問題是它沒有插入零或空它會直接跳過它,我需要顯示哪些分鐘沒有出現。 – user1391079

+0

創建一個包含特定時間間隔內的所有分鐘的表格。外部加入與完全合格的分鐘相反。只採取有參考日期但沒有數據的結果。 –

回答

0

一個解決方案是使用一個CTE創建的DATETIME秒的名單,然後LEFT JOIN這些到您的原始查詢。您也可以創建一對錶格(如註釋中所述) - 谷歌DimDate和/或DimTime。

喜歡的東西(未經測試):

DECLARE @StartDate DATETIME = '2016-06-01'; 
DECLARE @EndDate DATETIME = '2016-06-02'; 

WITH Dates AS (
    SELECT @StartDate [Date] 
    UNION ALL 
    SELECT DATEADD(SECOND, 1, [Date]) FROM Dates 
    WHERE [Date] < DATEADD(DAY, 1, @EndDate) 
) 
SELECT 
d.Date [Created Date] 
,COALESCE(Qry.DatalogValue, 0) DatalogValue 
FROM Dates d 
LEFT JOIN (
    Your query goes here 
) Qry 
ON d.Date = Qry.CreatedDate 
OPTION (MAXRECURSION 0) 
+0

你好,謝謝你的建議,我得到了一個語法錯誤,在第9行。我修好後,會讓你知道它的工作與否 – user1391079

+0

只是與你檢查我應該爲D.DatalogValue放什麼?介意分享 – user1391079

+0

抱歉,錯字 - 這只是您在子查詢中選擇的值,我會更新答案。 –

0

你的解決方案似乎非常危險的我。你確定要比較幾秒嗎?我會截斷到幾分鐘。我建議更強大的解決方案:

WITH Dates AS 
(--Your dates and values 
    SELECT * FROM (VALUES 
    ('2016-06-01 00:29:29', 0.01), 
    ('2016-06-01 00:30:29', 0.02), 
    ('2016-06-01 00:31:29', 0.03), 
    ('2016-06-01 00:33:29', 0.04)--,('2016-06-01 01:00:28', 0.05) 
    ) T(CreateDate, CatalogValues) 
), Minute10 AS --Generate numbers from 0-999999 
(
    SELECT * FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(0)) T1(Value) 
), Minute1000 AS 
(
    SELECT M1.Value FROM Minute10 M1 CROSS JOIN Minute10 M2 CROSS JOIN Minute10 
), Minute1000000 AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1))-1 Value 
    FROM Minute1000 
    CROSS JOIN Minute1000 M2 
), RangeValues AS --for simplicity, min and max values from dates 
(
    SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, MIN(CreateDate)), 0) MinDate, 
      DATEADD(MINUTE, DATEDIFF(MINUTE, 0, MAX(CreateDate)), 0) MaxDate 
    FROM Dates 
) 
SELECT TOP(1+DATEDIFF(MINUTE, (SELECT MinDate FROM RangeValues), (SELECT MaxDate FROM RangeValues))) 
DATEADD(MINUTE,Value,MinDate) ExpectedDate, CreateDate, CatalogValues 
FROM Minute1000000 
CROSS APPLY (SELECT MinDate FROM RangeValues) T 
LEFT JOIN Dates ON DATEADD(MINUTE,Value,MinDate)=DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CreateDate), 0) 

請注意,所有日期都被截斷爲分鐘。您可以通過刪除數字生成部分來簡單地進行查詢(數字可以放置在實用程序表中,如果這是您需要的全部值,則可以放置1440個值)。最小值和最大值可以預先計算。

這導致下面的輸出(可以處理的範圍的minDate +999999分鐘,可以簡單地擴展):

ExprectedDate    CreateDate   CatalogValues 
2016-06-01 00:29:00.000 2016-06-01 00:29:29 0.01 
2016-06-01 00:30:00.000 2016-06-01 00:30:29 0.02 
2016-06-01 00:31:00.000 2016-06-01 00:31:29 0.03 
2016-06-01 00:32:00.000 NULL     NULL 
2016-06-01 00:33:00.000 2016-06-01 00:33:29 0.04 

說明:

日期只是源表。表Minute10 .. Minute1000000將生成0到999999之間的數字(10個交叉連接10 = 100,100個交叉連接x3 = 100^3 = 1000000)。上表中的記錄被編號以獲得順序值。從評估所有百萬價值RangeValues包含MAX和MIN日期,爲簡單起見

算法:。

由於需要從MIN最新記錄到MAX日起每分鐘,你評價TOP DATETIFF(MINUTE,MIN,MAX)+1記錄(+1避免Fencepost錯誤)所有需要的表格都會加入(CROSS APLLY將MIN列添加到每條記錄中),預計日期按MIN(分鐘)日期+以分鐘爲單位的順序值計算。 ast加入,從左到右匹配與源表每分鐘生成的日期。如果匹配,則記錄被追加(加入)。如果不匹配,則附加NULL。注意`DATEADD(MINUTE,DATEDIFF(MINUTE,0,@someDate),0)'從日期截斷秒數。

+0

嗨,你好,你的解決方案有點複雜,我想你想更詳細地解釋一下嗎? – user1391079

相關問題