0

Eligibility Table [ET] 中有 Eligible [Eg] 和 Ineligible [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 

我想返回这样一个事实,即由于 01.01.2012 的资格记录,Joe Schmoe 在 02.01.2012 上午 11:00 的服务符合资格,Joe Schmoe 在 01.25.2012 下午 1:00 因为没有资格而没有资格获得服务2012 年 9 月 2 日下午 4:00 有资格获得服务,因为 2012 年 1 月 29 日有资格记录。

__ _ __ _ __ _ __结果_ __ _ __ _ __ _ __ _ __ _ __

Joe Schmoe 02.01.2012 11:00 AM 合格 01.01.2012
Joe Schmoe 01.25.2012 1:00 PM 不合格 01.20.2012
Harold Doe 02.09.2012 4:00 PM 不合格 01.29.2012

4

4 回答 4

2

apply was designed for this.

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

This will get you the most recently (order by ETDate desc) proceeding record (where ETDate <= ST.Date). Thanks to mikeY for fiddle.

于 2012-06-01T20:38:03.023 回答
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
于 2012-06-01T19:57:02.723 回答
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
于 2012-06-01T19:10:54.643 回答
0

这似乎是一个奇怪的要求,因为 elibility 不在用户级别。

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

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 子句的正确信息。

于 2012-06-01T19:45:34.110 回答