子查询匹配最近的子表记录

问题描述 投票:0回答:1

场景

enter image description here

enter image description here

要求.

选择与最近审核记录匹配且其创建日期已超过 6 个月的所有非活动规则 (Rule_table.Status),其中audit_text='status_change'。

在上面的示例中,有 2 个审核记录处于非活动状态,查询不应选择 Rule_id 4 作为其最后一个审核记录,其中audit_text“Status_Change”仅一个月前。

下面是我尝试过的 SQL(Microsoft SQL 服务器- TSQL)

  select R.Id, A.created_date from Rule R
    join Rule_Audit A on R.id=A.id
    where R.ID= (
      select top1 1 ID from Rule_Audit where Rule_Id=R.Rule_Id and created_date < dateadd 
       (MONTH, -7, GETDATE()) order by created_date desc
    )
  and R.status='Inactive'

但是这个查询给出的结果是规则 ID 4,因为上面的查询匹配其审计记录 100。有人可以帮助我正确的查询吗

sql-server join subquery
1个回答
0
投票

您应该以文本格式添加一些测试数据,但类似这样的东西可能会起作用:

SELECT  R.Id, x.created_date
FROM    [RULE] R
CROSS APPLY (
        SELECT  TOP 1 A.*
        FROM    Rule_Audit A
        WHERE   A.id = R.id
        AND A.audit_text='status_change'
        ORDER BY A.created_date DESC
    ) x
WHERE   x.created_date < dateadd(MONTH, -7, GETDATE())
AND R.status='Inactive'

这样,您首先获得最新的规则审核,然后在 APPLY 获取之外获得,因此它至少有 7 个月的历史了

© www.soinside.com 2019 - 2024. All rights reserved.