资格表[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
答案 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),您:
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子句的正确信息。