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

查询需要包含 7,因为最后一次出现在订单 7 中的“OBC”是在 48 小时前。它不需要包括 8,因为 8 在过去 48 小时内有一个“OBC”。

我完全不知道如何编写这个查询。

我知道的 -

1) 如何使用带有 datediff 和 getdate 的“have”子句仅隔离过去 48 小时内创建的笔记

2)如何使用 where 子句仅显示注释不包含“OBC”的那些行

我不知道的-

1) 我如何让查询说:“好的,我将列出过去 48 小时内没有 OBC 短语的所有订单!首先,我要将订单 7 放在此列表中,因为它确实“在过去的 48 小时内没有 OBC。其次,我不会将订单 8 放在此列表中,因为与它相关的注释上写着过去 48 小时的 OBC。”

任何指导/帮助始终不胜感激!

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
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 回答
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 回答