在事件完成后查找接下来的3次 - SQL Server

时间:2014-12-23 22:12:20

标签: sql-server subquery

请在此查询中获得一些帮助。我们有在帐户(地点)发生的事件(驱动器),一旦发生,它们在数据库中标记为完成(状态ID = 2)。

对于此查询,我希望能够搜索特定帐户,查找上次在此帐户中完成事件,然后找到将要发生的下三个已确认(状态ID = 1)的事件在这个帐户。

我不确定如何处理这个问题。我猜测某种子查询,但我在启动时遇到了一些麻烦。

到目前为止我所拥有的是:

select 
    dm.driveid, dm.fromdatetime, dm.statusid, stat.statustext, acct.internalname
from 
    rpt_drivemaster dm
inner join 
    rpt_accounts acct on dm.accountid = acct.accountid
inner join 
    rpt_drivestatusdef stat on dm.statusid = stat.statusid
where 
    acct.accountid = '17708'
    and dm.fromdatetime >= dateadd(month, -1, getdate())
    and dm.statusid not in (3,5,6)
order by 
    dm.fromdatetime;

这将为我提供此帐户的所有驱动器可追溯到一个月并期待。但我真正想做的只是给我下三个驱动器(2015年1月28日,2015年2月4日,2月18日)。

enter image description here

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

试试这个:

with completes as (
    select dm.driveid, dm.fromdatetime, dm.statusid, stat.statustext, acct.internalname
    from rpt_drivemaster dm
    inner join rpt_accounts acct on dm.accountid=acct.accountid
    inner join rpt_drivestatusdef stat on dm.statusid=stat.statusid
    where acct.accountid='17708'
    and dm.fromdatetime >= dateadd(month,-1,getdate())
    and dm.statusid = 2
),
confirmed as (
    select top(3) dm.driveid, dm.fromdatetime, dm.statusid, stat.statustext, acct.internalname
    from rpt_drivemaster dm
    inner join rpt_accounts acct on dm.accountid=acct.accountid
    inner join rpt_drivestatusdef stat on dm.statusid=stat.statusid
    inner join completes as c
    on c.accountid = dm.accountid
    and dm.fromdatetime > c.fromdatetime
    where dm.statusid = 1
    order by dm.fromdatetime
)
select * from completed
union
select * from confirmed
order by fromdatetime;