SQL查询最近的日期并受另一列约束

时间:2010-08-27 02:09:56

标签: sql oracle aggregate-functions

我有一个表(PAT_PROCEDURES),其中包含三列:patient_id,procedure_id,procedure_date和token_id,用于存储有关患者和他们所经历的程序的记录以及程序的日期;令牌ID是一种特殊的数字标识符。

我还有另一个表(PAT_TOKENS),其中包含三列patient_id和token_id,它有第一个表中这些患者的子集,但令牌ID为0.我正在尝试将令牌ID更新为从第一个表执行的最新程序,其中程序是程序IDS的有限列表之一....基本上这是我到目前为止所拥有的:

merge into pat_tokens t 
using (
  -- select all patients with most recent procedure among procedure IDs (45, 66, 78)
) procs on (t.patient_id = procs.patient_id)
when matched then
 update set t.token_id = procs.token_id

评论的选择查询是我正在努力的方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

 select patient_id 
 from PAT_procedure P
  inner join (select procedure_id, max(procedure_date) as last_date
              from PAT_procedure
              where procedure_id in (45, 66, 78)
              group by procedure_id) mx
  on p.procedure_id = mx.procedure_id and p.procedure_date = mx.last_date

答案 1 :(得分:0)

您没有说出哪个DBMS,但是现在假设SQL 2008,因为它有MERGE ...

UPDATE t
SET t.token_id = x.token_id
FROM
   pat_tokens t
   CROSS APPLY (
      SELECT TOP 1 p.token_id
      FROM pat_procedures p
      WHERE
         p.procedure_id IN (45, 66, 78)
         AND p.patient_id = t.patient_id
      ORDER BY p.procedure_date DESC
    ) x
WHERE t.token_id <> procs.token_id

我确定希望你在pat_procedures中有一个关于patient_id的索引。假设非聚簇索引比聚簇索引窄,那么如果它是聚簇的,或者甚至更好,如果它是包含procedure_id,token_id和procedure_date的非聚簇索引,那将是很好的。如果您不需要它,请不要创建最后一个索引。

我刚才意识到我可能会误解,也许这就是你的意思:

UPDATE t
SET t.token_id = x.token_id
FROM
   pat_tokens t
   CROSS APPLY (
      SELECT TOP 1 p.token_id, p.procedure_id
      FROM pat_procedures p
      WHERE p.patient_id = t.patient_id
      ORDER BY p.procedure_date DESC
    ) x
WHERE
   t.token_id <> x.token_id
   AND x.procedure_id IN (45, 66, 78)

这是另一种方法,只是回答你正在寻找的SELECT语句的问题:

SELECT patient_id
FROM (
   SELECT TOP 1 * WITH TIES
   FROM pat_procedures p
   ORDER BY p.procedure_date DESC
) x
WHERE x.procedure_id IN (45, 66, 78)

我不确定我找到了你想要的内容,但回复后我会根据需要进行更新。

<强>更新

既然我知道它是Oracle,我将无法为您提供查询。

但我知道Oracle支持窗口函数。如果您可以将我上面的任何一个查询转换为正确的Oracle语法,该语法为派生表中最新日期的每一行指定数字1,然后加入到过程ID正确的那个,您应该拥有它。我明天会试着回到这个......