SQL查询 - 查询当前日期但是条件来源于过去

4

我希望你能协助翻译以下情况:

我有一个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

由于这辆车是在之前进行了一次换油保养的服务后唯一的服务日期。

任何帮助都将不胜感激。


Edwin发布的答案在一个用例中失败了。 - Amnesh Goel
你应该仔细检查这个SQLFiddle,因为Edwin提供的解决方案失败了。 - Amnesh Goel
3个回答

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
@IsmaelFuentes 在这种情况下,我宁愿使用 EXISTS,因为 INNER JOIN 需要使用 DISTINCTGROUP BY - Edwin Stoteler
对我来说,它看起来可以适用于每种情况。 - Nick.McDermaid
@AmneshGoel 我在另一个回答的评论中看到,如果上次的服务是更换机油,除非之前已更换过机油,否则不应包括在内。 - Edwin Stoteler
@EdwinStoteler,你看到sqlfiddle了吗?你还觉得1237应该包含在你的答案中吗? - Amnesh Goel
1237之前更换过机油吗?也许我在这里漏掉了什么。 - Nick.McDermaid
显示剩余7条评论

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

这样做不行,因为它无法区分立即前一次换油和上一次换油。回答错误。 - Amnesh Goel
那如何处理之前的请求? - Amnesh Goel
@Neil P 如果这辆车更换了多次机油,那么这将返回多个结果。 - Edwin Stoteler
应该使用select distinct来处理 :) - Neil P
@NeilP 好的,没错,我没看到。我不太喜欢distinct,因为它可能会隐藏错误。 - Edwin Stoteler

0

这个问题有很多条件,例如:

  • 其中一个服务应该在指定日期发生。

  • 在那个日期之前的服务只能是“换油”。如果之前的服务不是“换油”,即使符合条件1,也不要将其包括在结果中。此外,如果汽车过去有换油的记录,则无关紧要。

  • 如果汽车有换油记录但在那个日期没有服务,则不应考虑。

您可以尝试这个解决方案... 这里是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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接