2017-01-03 3 views
2

iは2つのSQLテーブルSQLはそう1つのテーブルから日付が異なる表から2日付

  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 

私が望む結果は、同じIDを持ち、例えばID1の場合、それは1/1/2017と3/1/2017 で、表2には、同じ日付の日付(同じ日を含む)とブール値がfalseの同じ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 -upload-images-of-ask-a-question/285557#285557) –

答えて

2

同じIDを持つTable1の行数はいくつですか?私は2と仮定しますが、クエリは1または3+であっても合理的に動作します。

"は互いに続いています" - 2つの日付が同じでない限り、2つの日付はお互いに続くので、下の唯一の実際のチェックは不等式です。

"ブール値はfalseです" - ブール値が異なる2つのローがあります。私はそれらの両方が偽でなければならないと仮定します。 (偽真、0が1である)

サンプル・データ

これはあなたのサンプルデータがあなたの質問に提示する方法です。少なくともあなたは、何が月で、何が何であるかを推測する必要がないような方法で日付を書くべきです。 (ID, dt)Table2

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 
; 

結果

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

インデックスが大いに役立つでしょう。

関連する問題