2017-06-27 105 views
0

之間的映射我有兩個查詢返回以下數據:創建兩個表

結果1:

2017-02-27 10:54:30.000 
2017-02-27 10:55:30.000 
2017-02-27 10:59:30.000 
2017-02-27 11:02:30.000 

結果2:

2017-02-27 10:52:42.000 2017-02-27 10:55:00.000 
2017-02-27 10:55:05.000 2017-02-27 10:55:43.000 
2017-02-27 10:57:30.000 2017-02-27 11:00:12.000 
2017-02-27 11:01:55.000 2017-02-27 11:02:57.000 

在第二結果中的行的思考設置爲時間間隔,讓我們稱第一列'開始'和第二列'結束'。我需要的是創建某種映射,並找出第二個結果集中有多少行在第一個集合中沒有「匹配」。我的意思是...

這裏是一個例子:看第二個表的第一行R1。

2017-02-27 10:52:42.000 2017-02-27 10:55:00.000 

如果在第一個表中沒有行,以便它的價值將是起點和終點值,那麼我們將返回行R1之間。輸出應該是所有這些行的計數。

感謝您的幫助!

回答

2

此處的一種方法是將包含間隔的表格左連接到第一個表格。然後計算第二個表中第一個表中沒有時間戳的間隔之間的所有記錄。

SELECT COUNT(*) 
FROM Result2 r2 
LEFT JOIN Result1 r1 
    ON r1.dt BETWEEN r2.interval1 AND r2.interval2 
WHERE r1.dt IS NULL 
+0

如果您將您的答案與下面的答案進行比較,是否有任何性能差異?謝謝! –

+0

艱難的呼叫...其他答案可能會稍微快一點,但如果您在間隔列上有索引,則兩者都應該相當快。 –

+0

如果我需要它,這將如何改變,使得來自r1的行只能使用一次?換句話說,不要將一個時間戳映射到兩個時間間隔。謝謝! –

1

如果在第一個表中沒有行,以便其價值將是起點和終點之間的值

這可以非常直接轉化爲SQL:

select count(*) from Result2 r2 
where not exists (
    select * from Result1 r1 
    where r1.value between r2.start and r2.end 
) 
+0

如果您將您的答案與上面的答案進行比較,是否有任何性能差異?謝謝! –

+0

我不能說 - SQL優化器非常聰明。找出最好的方法是通過測試!嘗試在真實數據上運行這兩個版本,然後打開「包括實際執行計劃」以查看他們在做什麼 – Blorgbeard

+0

如果我需要這種更改,那麼來自r1的行只能使用一次?換句話說,不要將一個時間戳映射到兩個時間間隔。謝謝! –