对最近日期的SQL查询和另一列的约束
我有一个包含三列的表(PAT_PROCEDURES):patient_id,procedure_id,procedure_date和token_id,用于存储关于患者和程序以及过程日期的记录;令牌ID是一个特殊的数字标识符。对最近日期的SQL查询和另一列的约束
我也有另一个表(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
的评论选择查询是我”正在挣扎着。
谢谢!
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
你没有说哪个DBMS,但现在假定SQL 2008,因为它有合并...
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)
我不确定我是否正确地查找了您要查找的内容,但回复并根据需要进行更新。
UPDATE
现在,我知道这是甲骨文,我将不能够只是鞭打查询你。
但我知道Oracle支持窗口功能。如果您可以将上面的任何一个查询转换为正确的Oracle语法,该语法为派生表中最近日期的每行赋予数字1,然后加入到过程id正确的那一行,您应该拥有它。我会尽力回到这个明天......
对不起,我忘了提数据库,它是Oracle – wsb3383 2010-08-27 04:27:18
对于什么数据库? – 2010-08-27 02:12:23
数据库是Oracle – wsb3383 2010-08-27 04:24:58