我正在寻求以下方案的帮助:
我有一个SQL Server数据库,其中包含一个存储历史数据的表。例如,让我们使用以下作为样本集。
CAR, SERVICE DATE, FINDINGS
1234, 21/01/2001, Fuel Filter
1234, 23/09/2009, Oil Change
1234, 30/09/2015, Tyres
3456, 30/09/2015, Clutch
我希望从以下示例中恢复显示在给定日期带来的任何汽车的服务的结果,例如: 2015年9月30日,但只有在过去换油。
查询只会带回来:
1234, 30/09/2015, Tyres
因为它是那个日期唯一一辆以前换油的服务。
非常感谢任何帮助。
答案 0 :(得分:2)
使用EXISTS子句:
SELECT cur.car,
cur.[service date],
cur.findings
FROM tablename cur
WHERE cur.[service date] = @mydate
AND EXISTS (
SELECT 1
FROM tablename past
WHERE past.car = cur.car
AND past.[service date] < cur.[service date]
AND past.findings = 'oil change'
)
答案 1 :(得分:0)
我会以cte。
来做查找已更换油的汽车列表,然后重新连接到原始表以查找交叉点。
DECLARE @date datetime;
SET @date = '20150930'
with oil_Cte as (
select distinct car from
tableName
where findings = 'oil change'
and date < @date
)
select *
from tableName
inner join oil_cte on tableName.car = oil_cte.car
where date = @date
答案 2 :(得分:0)
这个问题有很多条件,比如
其中一项服务应在指定日期进行。
到那个日期的先前服务只是'换油'。如果以前的服务不是“换油”,那么不要将其包含在结果中, 即使它符合条件1.与此同时,如果汽车有记录 OIL Chagne过去然后没关系。
如果汽车有OIL CHANGE记录但在该日没有服务,则不应考虑。
你可以尝试这个解决方案..这里有适合你的工作SQLFiddle
select * from #t where car in (
select car from (
select car, [service date], findings, ROW_NUMBER() over (Partition by car order by [Service Date] desc) as [row]
from (select * from #t where car in (select car from #t where [service date] = '2015-09-30')) A) T
where T.row =2 and Findings = 'Oil Change'
) and [service date] = '2015-09-30'