查询最近的进行记录

时间:2012-06-01 19:01:21

标签: sql sql-server date

资格表[ET]中有符合条件[Eg]和不合格[In]的记录。每条记录只附加一个日期。我在服务表[ST]中有客户服务[CS],我需要确定最近服务日期之前的记录类型。


______________ET______________



Eg    01.01.2012  
In    01.20.2012  
Eg    01.29.2012  
In    02.10.2012  

_________________________ST______________________________  

CS  Joe Schmoe  02.01.2012 11:00 AM  
CS  Joe Schmoe  01.25.2012 1:00  PM  
CS  Harold Doe  02.09.2012 4:00  PM 

我想返回的事实是,由于2012年1月1日的资格记录,Joe Schmoe在02.01.2012 11:00 AM的服务符合资格,因此Joe Schmoe在01.25.2012下午1:00没有资格获得服务,因为2012年01月20日,由于2012年1月1日的资格记录,Harold Schmoe有资格获得服务,并于2012年1月2日下午4:00获得服务。

__ _ __ _ __ _ __ 结果 _ __ _ __ _ __ _ __ < EM> _ __ _ __

Joe Schmoe 02.01.2012 11:00 AM符合条件的01.01.2012
Joe Schmoe 01.25.2012 1:00 PM Ineligible 01.20.2012
Harold Doe 02.09.2012 4:00 PM Ineligible 01.29.2012

4 个答案:

答案 0 :(得分:2)

我是这样做的:

http://sqlfiddle.com/#!3/1c73b/5

select fname, etdate, 'eligible' as eligible
from st
where  etdate between 
(select max(etdate) from et where status ='Eg')
and
(select max(etdate) from et where status ='In')
union
select fname, etdate, 'ineligible' as eligible
from st
where  etdate not between 
(select max(etdate) from et where status ='Eg')
and
(select max(etdate) from et where status ='In')
order by 2

答案 1 :(得分:2)

apply就是为此而设计的。

select
    ST.fName, stETD = ST.etDate, previousET.*
from
    ST
    outer apply (
        select top 1
            ET.Status,
            ET.ETDate
        from
            ET
        where
            ET.ETDate <= ST.etDate
        order by
            ET.ETDate desc
    ) previousET
order by
    2

http://sqlfiddle.com/#!3/1c73b/11

这将为您提供最近的(order by ETDate desc)进行记录(where ETDate <= ST.Date)。感谢mikeY小提琴。

答案 2 :(得分:0)

假设资格表中的UserId和Date有唯一约束(否则,您需要另一个决胜局,例如在userid,date上添加row_number),您:

  • 加入日期少于您感兴趣的日期的所有记录(CS日期)
  • 然后,您将获取这些日期的最大值(因为您希望事件之前的最后一个日期)
  • 然后,您将JOIN返回到原始表以获取其余的行详细信息(状态类型)。这就是您需要唯一约束
  • 的原因
  

SELECT
   UserId, Date, Status, ETDate
FROM (
    --The last matching status record by date
    SELECT ST.UserId, ST.Date, MAX(ET.Date) as ETDate
    FROM ST
    JOIN ET ON
       ST.UserId = ET.UserId
       AND CS.Date >= ET.Date
    GROUP BY
       ST.UserId, ST.Date
) as C
JOIN ET as E ON
    C.UserId = E.UserId
    AND C.ETDate = E.ETDate

答案 3 :(得分:0)

这似乎是一个奇怪的请求,因为可达性不在用户级别。

以下查询可以执行您想要的操作:

select et.*, st.elibility, st.ETDate
from et cross join
     (select st.*
      from st join
           (SELECT MAX(cs.Date) as lastcsDate
            FROM st JOIN
                 et
                 ON st.Date <= et.Date
            GROUP BY cs.UserId
           ) t
           on st.date = t.lastcsDate
     ) lastst

注意:我没有运行此查询来原谅任何拼写错误。

这使用相关子查询来获取et表中每个日期之前或之前的最新日期。其余的只是加入select子句的正确信息。