2017-01-03 32 views
2

2個日期之間我有2個SQL表的Sql檢查是否從1代表的日期是從不同表

  1. 具有ID,日期,布爾值
  2. 具有ID,日期

所以表1看起來像這樣

1 3/1/2017 false 
    2 3/1/2017 true 
    1 1/1/2017 false 
    2 10/12/2016 false 

表2這樣

1 3/1/2017 
    2 3/1/2017 
    1 2/1/2017 
    1 12/12/2016 

我想要的結果是表1中的每個日期對具有相同的ID,並且相互跟隨,例如對於ID 1,它是2017年1月1日和2017年3月1日 以查找是否表2中的日期與這些日期(包括同一天)之間的相同ID以及布爾值爲假。

因此,例如,結果在這種情況下將
爲ID1 2017年2月1日,2017年3月1日

我怎樣才能做到這一點?

+3

添加一些示例表格數據和預期結果(以及格式化文本)。同時向我們顯示您當前的查詢嘗試。並標記你正在使用的dbms。 – jarlh

+1

「表1中的2個連續日期」是什麼意思? –

+1

** [編輯] **您的問題,並根據該數據添加一些示例數據和預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not - 當提問時/ 285557#285557) –

回答

2

有多少行可以在Table1具有相同的ID?我假設2,但查詢將工作合理,即使1或3+。

「彼此關注」 - 任何兩個日期都會跟着彼此,除非它們是相同的,所以下面唯一真正的檢查就是不平等。

「布爾值爲false」 - 有兩行,它們可以有不同的布爾值。我認爲他們都必須是假的。 (假爲0,真爲1)

的樣本數據

這是怎麼了你的樣本數據應該在你的問題提出。至少你應該寫一些日期,以便我們不必猜測月份和日期是什麼。

DECLARE @Table1 TABLE (ID int, dt date, Flag bit); 
INSERT INTO @Table1 (ID, dt, Flag) VALUES 
(1, '2017-01-03', 'false'), 
(2, '2017-01-03', 'true'), 
(1, '2017-01-01', 'false'), 
(2, '2016-12-10', 'false'); 

DECLARE @Table2 TABLE (ID int, dt date); 
INSERT INTO @Table2 (ID, dt) VALUES 
(1, '2017-01-03'), 
(2, '2017-01-03'), 
(1, '2017-01-02'), 
(1, '2016-12-12'); 

查詢

WITH 
CTE 
AS 
(
    SELECT 
     ID 
     ,MIN(dt) AS StartDT 
     ,MAX(dt) AS EndDT 
     ,MAX(CAST(Flag AS int)) AS MaxFlag 
    FROM @Table1 AS Table1 
    GROUP BY ID 
) 
SELECT 
    CTE.ID 
    ,A.dt 
FROM 
    CTE 
    CROSS APPLY 
    (
     SELECT 
      Table2.dt 
     FROM @Table2 AS Table2 
     WHERE 
      Table2.ID = CTE.ID 
      AND Table2.dt >= CTE.StartDT 
      AND Table2.dt <= CTE.EndDT 
    ) AS A 
WHERE 
    StartDT < EndDT -- "are following each other" 
    AND MaxFlag = 0 -- "the boolean is false" for both IDs 
; 

結果上Table2(ID, dt)

+----+------------+ 
| ID |  dt  | 
+----+------------+ 
| 1 | 2017-01-02 | 
| 1 | 2017-01-03 | 
+----+------------+ 

指數將有很大的幫助。

相關問題