我有一个表(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
评论的选择查询是我正在努力的方法。
谢谢!
答案 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正确的那个,您应该拥有它。我明天会试着回到这个......