我是 SQL 新手,所以请原谅任何符号的失误。我的问题的一个简化版本如下。我在 ADMISSIONS 表中有入院情况,需要在入院日期之前从表 CLAIMS 中收集最近的某种类型的门诊索赔:
SELECT a.ID , a.date, b.claim_date
FROM admissions as a
LEFT JOIN claims b on (a.ID=b.ID) and (a.date>b.claim_date)
LEFT JOIN claims c on ((a.ID=c.ID) and (a.date>c.claim_date))
and (b.claim_date<c.claim_date or b.claim_date=c.claim_date and b.ID<c.ID)
WHERE c.ID is NULL
问题是,对于某些 ID,我得到许多具有重复 a.date、c.claim_date 值的记录。
我的问题类似于这里讨论的问题
并在此处详细说明
但是,仅查找在 a.date 之前发生的 CLAIMS 中的记录会带来额外的麻烦,我认为这是导致问题的原因。
更新
不存储时间,只存储日期,并且由于患者可以在同一天拥有多个记录,因此这是一个问题。还有另一个问题,那就是我只想查看 CLAIMS 的一个子集(假设为 claim.flag=TRUE)。这是我最后尝试的:
SELECT a.ID , a.date, b.claim_date
FROM admissions as a
LEFT JOIN (
select d.ID , max(d.claim_date) cdate
from claims as d
where d.flag=TRUE
group by d.ID
) as b on (a.ID=b.ID) and (b.claim_date < a.date)
LEFT JOIN claims c on ((a.ID=c.ID) and (c.claim_date < a.claim_date))
and c.flag=TRUE
and (b.claim_date<c.claim_date or b.claim_date=c.claim_date and b.ID<c.ID)
WHERE c.ID is NULL
然而,这在中止之前运行了几个小时(通常需要大约 30 分钟,使用 LIMIT 10)。