0

我是 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 值的记录。

我的问题类似于这里讨论的问题

SQL join:选择一对多关系中的最后一条记录

并在此处详细说明

SQL左连接:选择一对多关系中的最后一条记录

但是,仅查找在 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)。

4

1 回答 1

1

您可能想尝试使用子查询来解决此问题:

SELECT a.ID, a.date, b.claim_date
  FROM admissions as a
  LEFT JOIN claims b ON (a.ID = b.ID)
  WHERE b.claim_date = (
    SELECT MAX(c.claim_date) 
      FROM claims c 
      WHERE c.id = a.id -- Assuming that c.id is a foreign key to a.id
        AND c.claim_date < a.date  -- Claim date is less than admission date
  );

尝试使用不同的 ID 进行澄清,并使用额外的子查询来解释重复日期:

SELECT a.ID, a.patient_id, a.date, b.claim_id, b.claim_date
  FROM admissions as a
  LEFT JOIN claims b ON (a.patient_ID = b.patient_ID)
  WHERE b.claim_id = (
    SELECT MAX(c.claim_id)  -- Max claim identifier (likely most recent if sequential)
      FROM claims c 
      WHERE c.patient_ID = a.patient_ID
                    AND c.flag = TRUE
                    AND c.claim_date = (
                        SELECT MAX(d.claim_date) 
                            FROM claims d
                            WHERE d.patient_id = c.patient_id 
                                AND c.claim_date < a.date  -- Claim date is less than admission date
                                AND d.flag = TRUE
                    )
  )
        b.flag = TRUE;
于 2013-10-03T20:44:34.033 回答