2

私の目標は、過去48時間に「OBC」というフレーズを含むメモなしで注文番号のリストを生成することです。

これが私が持っているものです。メモが注文に追加されるたびに、このような一意のタイムスタンプを持つ一意のレコードとしてデータベースに保存されます-

**Date**  | **Order Number** | **Note**
2/10/2013        7             OBC - Got customer approval to perform virus removal
2/28/2013        7             removed virus from system
2/28/2013        8             OBC - updated customer on status of their job
2/28/2013        8             new hard drives in stock for this system

「OBC」が最後に7番目に表示されたのは48時間以上前だったため、クエリには7を含める必要があります。8は過去48時間に「OBC」を持っているため、8を含める必要はありません。

私はこのクエリの書き方に完全に困惑しています。

私が知っていること -

1)datediffとgetdateで「having」句を使用して過去48時間に作成されたメモのみを分離する方法

2)where句を使用して、メモに「OBC」が含まれていない行のみを表示する方法

わからないこと-

1)「さて、過去48時間にOBCというフレーズのないすべての注文のリストを作成します!最初に、注文7をこのリストに追加します。過去48時間のOBCはありません。次に、過去48時間のOBCというメモが関連付けられているため、このリストに注文8を追加するつもりはありません。」

どんな指導/援助も常に感謝します!

4

3 に答える 3

2

私はこれがあなたが望むことをするだろうと思います:

select order_number
from t
having sum(case when DATEDIFF(day, date, getdate()) < 2 and
                     Note like '%OBC%'
                then 1 else 0
           end) = 0
于 2013-02-25T20:56:59.300 に答える
0

CTEファンとして(CTEハンマーですべてがCTEネイルのように見えます!)私は
http://sqlfiddle.com/#!3/1dd82/16で遊んだ

-- CREATE table Temp1
--  ( id int, date1 datetime, dsc varchar(256) )

With Notes as -- Later entries : without 'OBC'
( SELECT * FROM Temp1
  WHERE NOT(dsc like '%OBC%')
)
SELECT * FROM Notes 
WHERE EXISTS
  (SELECT id FROM Temp1 here
   WHERE here.id=Notes.id
     AND (dsc like '%OBC%')
     AND (DATEDIFF(day, date1, getdate()) > 2)
  ) -- entries with 'OBC' for same id in last 2 days

それがどれほどエレガントかはわかりませんが、読みやすいと思います:)

編集
そして、それがナットを割る大ハンマーであったことを証明するために、この場合、CTEは単純すぎて必要とされなかったので...

SELECT * from Temp1
WHERE NOT(dsc like '%OBC%')  -- Later entries : without 'OBC'
  AND EXISTS
   (SELECT id FROM Temp1 here
    WHERE here.id=Temp1.id
      AND (dsc like '%OBC%')
      AND (DATEDIFF(day, date1, getdate()) > 2)
   ) -- entries with OBC for same id in last 2d
于 2013-02-25T21:55:43.927 に答える
0
declare @Temp table ( id int identity, dt date, dsc varchar(256) );

insert into @Temp values ('2-1-13', 'OBC did something'),('2-2-13', 'OBC did something else'),('2-3-13', 'I am data but not what you want'),('2-4-13', 'OBC did something yet again')

-- everything as is
select *
from @Temp
;

with a as 
    (
    Select 
        Id
    ,   min(Dt) over() as firstDtOFOBC
    from @Temp
    where dsc like '%OBC%'
    )
select *
from a
    join @temp x on x.Id = a.Id
        and x.Dt < dateadd(day, 3, a.FirstDtOFOBC)
        -- I only want dates less than three days of first occurrence
于 2013-02-25T21:00:50.540 に答える