2017-09-29 9 views
3

隣接するレコードをネイティブSQLのシーケンスの不足レコードに戻す必要があります。シーケンス内の最初のエントリがない場合は、次のエントリのみを返します。シーケンス内に欠けている部分を探す必要はありません。 " - " は、配列を決定した後BatchIdでレコードが見つからずに隣接するレコードを返すSQL

BatchId(nvarchar(50), null) 
CreateDate(datetime, null) 
UserId(varchar(50), null) 
Batch(varchar(50), null) 

最後の数字:

これは、SQL Server 12.0.2000.8

問題の列の構造で実行されています。 BatchIdはバッチと相関します。バッチがBatchIdのシーケンスが1

BatchId   CreateDate    UserId  Batch 
######################################################### 
9K182855 - 1 2017-09-26 17:57:20.977 9K182855 8 
9K182855 - 2 2017-09-26 18:20:57.693 9K182855 8 
9K182855 - 1 2017-09-27 11:04:46.177 9K182855 9 
9K182855 - 2 2017-09-27 11:19:32.990 9K182855 9 

クエリにリセットする必要があります変更された場合、私のデータ

select BatchID, CreateDate, UserId, Batch from Results 
where CreateDate > dateadd(day,-2,getdate()) 
and Batch between 0 and 9 
order by UserId, CreateDate, Batch; 

これはGOODデータ

BatchId   CreateDate    UserId  Batch 
######################################################### 
4L182855 - 1 2017-09-28 14:04:46.177 4L182855 9 
4L182855 - 2 2017-09-28 15:19:32.990 4L182855 9 
4L182855 - 3 2017-09-28 16:30:27.953 4L182855 9 
4L182855 - 4 2017-09-28 17:57:20.977 4L182855 9 
4L182855 - 5 2017-09-28 18:20:57.693 4L182855 9 
4L182855 - 1 2017-09-29 11:04:46.177 4L182855 0 
4L182855 - 2 2017-09-29 11:19:32.990 4L182855 0 
4L182855 - 3 2017-09-29 11:30:27.953 4L182855 0 
4L182855 - 4 2017-09-29 11:57:20.977 4L182855 0 
4L182855 - 5 2017-09-29 12:00:57.693 4L182855 0 
4L182855 - 6 2017-09-29 12:04:46.177 4L182855 0 
4L182855 - 7 2017-09-29 12:19:32.990 4L182855 0 
4L182855 - 8 2017-09-29 12:30:27.953 4L182855 0 
4L182855 - 9 2017-09-29 13:57:20.977 4L182855 0 
4L182855 - 10 2017-09-29 14:20:57.693 4L182855 0 

これはあるあるを取得するために使用していますMISSINGデータ

BatchId   CreateDate    UserId  Batch 
######################################################### 
4L182855 - 1 2017-09-28 14:04:46.177 4L182855 9 
4L182855 - 2 2017-09-28 15:19:32.990 4L182855 9 
4L182855 - 4 2017-09-28 17:57:20.977 4L182855 9 
4L182855 - 5 2017-09-28 18:20:57.693 4L182855 9 
4L182855 - 1 2017-09-29 11:04:46.177 4L182855 0 
4L182855 - 2 2017-09-29 11:19:32.990 4L182855 0 
4L182855 - 3 2017-09-29 11:30:27.953 4L182855 0 
4L182855 - 4 2017-09-29 11:57:20.977 4L182855 0 
4L182855 - 5 2017-09-29 12:00:57.693 4L182855 0 
4L182855 - 6 2017-09-29 12:04:46.177 4L182855 0 
4L182855 - 7 2017-09-29 12:19:32.990 4L182855 0 
4L182855 - 8 2017-09-29 12:30:27.953 4L182855 0 
4L182855 - 10 2017-09-29 14:20:57.693 4L182855 0 

要件は、以下の行を返すことで、彼らは私がPythonでまたは可能性CLRユーザー定義関数を経由してこれを行うことが欠落しているレコードの

BatchId   CreateDate    UserId  Batch 
######################################################### 
4L182855 - 2 2017-09-28 15:19:32.990 4L182855 9 
4L182855 - 4 2017-09-28 17:57:20.977 4L182855 9 
4L182855 - 8 2017-09-29 12:30:27.953 4L182855 0 
4L182855 - 10 2017-09-29 14:20:57.693 4L182855 0 

に隣接しています。しかし、私はネイティブSQLで可能かどうかはわかりません。もしそうなら、私に教えてください。

+1

行が欠落しているかどうかは「バッチID」によって決まりますか? – SqlZim

+4

バッチの最初の行が見つからない場合の対処方法を教えてください。バッチの最後の行が見つからない場合を特定できますか? –

+0

はい、sir、 " - "の後のバッチIDの最後の数字です。バッチIDは常にバッチと相関する必要があります。バッチが9から0に変わると、BatchIdのカウンタは1にリセットされます。ユーザーIDは異なる場合があります。私はあなたのコメントを反映するために質問を変更します。ありがとうございました – rreeves

答えて

5

バッチシーケンスを取得するためにbatchidを切り捨てるstuff()を使用して、lead()lag()は計算BatchSeqため、前と次の行から値を取得する:

select s.BatchId, s.CreateDate, s.UserId, s.Batch 
from (
    select t.* 
    , PrevSeq = lag(x.BatchSeq) over (partition by Batch order by CreateDate) 
    , x.BatchSeq 
    , NextSeq = lead(x.BatchSeq) over (order by CreateDate) 
    from results t 
    cross apply (values (convert(int,stuff(t.batchid,1,charindex('- ',t.batchid)+1,''))) 
    ) x (BatchSeq) 
) s 
where BatchSeq - isnull(PrevSeq,0) != 1 
    or (BatchSeq - NextSeq !=-1 and NextSeq != 1) 
order by createdate 

rextesterデモ:http://rextester.com/ZCBLP37968

返信:

+---------------+---------------------+----------+-------+ 
| BatchId |  CreateDate  | UserId | Batch | 
+---------------+---------------------+----------+-------+ 
| 4L182855 - 2 | 2017-09-28 15:19:32 | 4L182855 |  9 | 
| 4L182855 - 4 | 2017-09-28 17:57:20 | 4L182855 |  9 | 
| 4L182855 - 8 | 2017-09-29 12:30:27 | 4L182855 |  0 | 
| 4L182855 - 10 | 2017-09-29 14:20:57 | 4L182855 |  0 | 
+---------------+---------------------+----------+-------+ 

これは、最初のレコードがない場合にも機能します。http://rextester.com/BLAD55913

+2

あなたはすぐに引き分けになります。 where節も非常にいいです。私が思いつくよりも効率的です。非常に素晴らしい。 –

+0

非常に印象的な、私の心が吹いたと考えてください。ありがとうございました – rreeves

+1

@rreevesお手伝いをしますように! – SqlZim

関連する問題