2016-10-27 18 views
1

質問:私は1日に2つのレコードを持たないレコードを特定したいと思います。それぞれの日のための第二の記録....日付範囲のレコードのギャップを特定します

SELECT TR.tourid, 
     TR.tourruntimestamp, 
     TC.tourname, 
     TC.tourfrequency, 
     TC.unit, 
     TC.division, 
     RANK() 
     OVER (
      PARTITION BY TR.tourid 
      ORDER BY TR.tourruntimestamp) AS [Rank] 
FROM DBO.tbltourrun AS TR 
     INNER JOIN DBO.tso_piml_tour_config AS TC 
       ON TC.tourid = TR.tourid 
WHERE (TC.tourfrequency = '2xDay') 
     AND (TR.tourruntimestamp BETWEEN Dateadd(DAY, Datediff(DAY, 0, Getdate()) - 1, 0) AND Dateadd(DAY, Datediff(DAY, 0, Getdate()), 0)) 

ScreenShot of Results

+0

ベンのための0を示し、これではありません明らかです。技術的なものを脇に置いて、あなたが何を扱っているのか、何を達成しようとしているのかを簡単な言葉で説明してください。 –

+0

どのレコードに1日あたり2レコード、1日に4レコードしか持たないレコードを識別したいのですか?私の簡略化された質問を参照してください。 –

+1

[パブリックフォーラムでT-SQL質問を投稿する方法]に関する次の記事をお読みください(http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on- a-public-forum /) –

答えて

1

もっと一般的な答えがあるかどうランクは私に語りました。私は以下に正しい方向にあなたを取得する必要が不自然な例であるあなたは数週間、数ヶ月など

select  * 

from  (SELECT  TR.TourID, TR.TourRunTimeStamp, TC.tourName, TC.tourFrequency, TC.Unit, TC.Division 
         ,count(*) OVER (PARTITION BY TR.TourID) AS cnt 
      FROM   dbo.tblTourRun AS TR INNER JOIN 
            dbo.TSO_PIML_Tour_Config AS TC ON TC.tourID = TR.TourID 
      WHERE   TR.TourRunTimeStamp BETWEEN DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 
      ) t 

where  cnt <> case TC.tourFrequency when '1xDay' then 1 when '2xDay' then 2 when '4xDay' then 4 end 
; 

select  * 

from  (SELECT  TR.TourID, TR.TourRunTimeStamp, TC.tourName, TC.tourFrequency, TC.Unit, TC.Division, count(*) OVER (PARTITION BY TR.TourID) AS cnt 
      FROM   dbo.tblTourRun AS TR INNER JOIN 
            dbo.TSO_PIML_Tour_Config AS TC ON TC.tourID = TR.TourID 
      WHERE  (TC.tourFrequency = '2xDay') AND (TR.TourRunTimeStamp BETWEEN DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 
      ) t 

where  cnt = 1 
; 
+0

それぞれは独自の方法でSQLを書式設定していますが、特に私はあなたのことを気に入っていません。私は[このフォーマッタ](http://www.dpriver.com/pp/sqlformat.htm)を提案してもいいですか? –

+1

@TT。 **(1))**すべての句のキーワード(select、from、where、group by、having、order by、qualify)は左下に並んでいます。 **(2)**形式はパターンを強調します。例えば同じウィンドウを持つ分析関数は、たとえそれが非常に長い行であっても、1行に1つずつ存在します。 **(3)**複雑な表現は、その部分によって複数の行に分割されています。 **(4)**スペース。 1つの画面にコード全体が表示されても構わないと思います。 ** P.s ** **私はベンのオリジナルのコードを取っただけで、それがより簡単になるようにラップしました。 –

+0

ちょっと、私が言ったように、自分自身に:) –

1

でやりたいんかわかりません。私はあなたが作業しようとしているデータの形状をシミュレートするために作られた値のテーブルを使用しています(この例には関係のない値を取り除きます)。

select a.TourId 
    , b.TourDate 
from (values 
    (1, Convert(datetime2(0), N'2016-01-01 00:00:00')) 
    , (1, Convert(datetime2(0), N'2016-01-01 04:00:00')) 
    , (1, Convert(datetime2(0), N'2016-01-03 00:00:00')) 
    , (1, Convert(datetime2(0), N'2016-01-04 00:00:00')) 
    , (1, Convert(datetime2(0), N'2016-01-04 04:00:00')) 
    , (1, Convert(datetime2(0), N'2016-01-05 00:00:00')) 
    , (2, Convert(datetime2(0), N'2016-02-11 00:00:00')) 
    , (2, Convert(datetime2(0), N'2016-02-11 18:00:00')) 
    , (2, Convert(datetime2(0), N'2016-02-13 00:00:00')) 
    , (2, Convert(datetime2(0), N'2016-02-14 00:00:00')) 
    , (2, Convert(datetime2(0), N'2016-02-14 18:00:00')) 
    , (2, Convert(datetime2(0), N'2016-02-15 00:00:00')) 
) as a (TourId, TourRunTimeStamp) 
cross apply (values(Convert(date, a.TourRunTimeStamp))) as b (TourDate) 
group by a.TourId 
     , b.TourDate 
having Count(1) != 2; -- find ids with exactly two entries 
-- having Count(1) in (2, 4); -- find ids with exactly two or four entries 
-- having Count(1) % 2 = 0; -- find ids with an even number of entries 

ここにロジック単純です:日付に日時を変換する(我々は計算再利用できるように、この限りで句で行われている)、TourId + TourDateのグループは、レコードの数を数えます2に等しいカウントを持たないすべての結果を除外します。

0

最終SQL結果:
一部CTEのか、見解の助けを借りて、私はそれを動作させることができました。ツアーそう不在されたとき

  1. クエリ1-ツアー日付の範囲(昨日)
  2. クエリ日付スタンプ列に
  3. クエリ3-条件カウントをゼロとして無日付スタンプ付きツアーを示す2-概要間走っ私は逃したルート

`--Get All ToursRanYesterday 
WITH toursranyesterday 
    AS (SELECT TR.tourid, 
       TR.tourruntimestamp, 
       TC.tourname, 
       TC.division, 
       TC.unit, 
       TC.tourfrequency 
     FROM dbo.tbltourrun AS TR 
       INNER JOIN dbo.tso_piml_tour_config AS TC 
         ON TC.tourid = TR.tourid 
     WHERE (TC.tourfrequency LIKE '%xDay%') 
       AND (TR.tourruntimestamp 
         BETWEEN Dateadd(day, Datediff(day, 
            0,Getdate()) - 1, 0) 
                AND 
         Dateadd(day, Datediff(day, 
            0, Getdate()), 0))), 
    --Get Summary of xDay Tours Ran with Missing Tours 
    toursummary 
    AS (SELECT TC.tourid, 
       TC.division, 
       TC.unit, 
       TC.tourname, 
       TC.tourfrequency, 
       (CASE 
        WHEN EXISTS (SELECT * 
           FROM toursranyesterday AS TY 
           WHERE TC.tourid = TY.tourid) THEN 'NO' 
        WHEN NOT EXISTS (SELECT * 
            FROM toursranyesterday AS TY 
            WHERE TC.tourid = TY.tourid) THEN 'YES' 
        END) AS Missed, 
       TY.tourruntimestamp 
     FROM dbo.tso_piml_tour_config AS TC 
       FULL OUTER JOIN toursranyesterday AS TY 
          ON TY.tourid = TC.tourid 
     WHERE (TC.tourfrequency LIKE '%xDay%')) 
--Add Daily Tour Count when Missed = NO 
SELECT TS.tourid, 
     TS.division, 
     TS.unit, 
     TS.tourname, 
     TS.tourfrequency, 
     TS.missed, 
     TS.tourruntimestamp, 
     Count(CASE 
       WHEN missed = 'NO' THEN 1 
       ELSE NULL 
      END) 
     OVER ( 
      partition BY TS.tourid) AS [DailyTourCount] 
FROM toursummary AS TS 
ORDER BY TS.tourname ` 
関連する問題