Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询最近日期并受另一列约束_Sql_Oracle_Aggregate Functions - Fatal编程技术网

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

SQL查询最近日期并受另一列约束,sql,oracle,aggregate-functions,Sql,Oracle,Aggregate Functions,我有一个表(PAT_PROCEDURES),有三列:patient_id、PROCEDURES_id、PROCEDURES_date和token_id,其中存储了关于患者及其经历的程序以及程序日期的记录;令牌ID是一个特殊的数字标识符 我还有另一个表(PAT_TOKENS),它有三列patient_id和token_id,它有来自第一个表的这些患者的子集,但token id为0。我正在尝试将令牌ID更新为从第一个表执行的最新过程的ID,其中的过程是一个有限的过程ID列表中的一个…基本上,到目前为

我有一个表(PAT_PROCEDURES),有三列:patient_id、PROCEDURES_id、PROCEDURES_date和token_id,其中存储了关于患者及其经历的程序以及程序日期的记录;令牌ID是一个特殊的数字标识符

我还有另一个表(PAT_TOKENS),它有三列patient_id和token_id,它有来自第一个表的这些患者的子集,但token id为0。我正在尝试将令牌ID更新为从第一个表执行的最新过程的ID,其中的过程是一个有限的过程ID列表中的一个…基本上,到目前为止,我得到的是:

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查询是我正在努力解决的问题


谢谢

您没有说是哪个DBMS,但假设SQL 2008现在已经合并了

 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
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
我不确定我有没有正确的你正在寻找的,但回复回来,我会根据需要更新

更新

既然我知道这是甲骨文,我就不能为你提出一个问题了


但我知道Oracle支持窗口功能。如果您可以将上面的任一查询转换为正确的Oracle语法,将数字1分配给派生表中具有最新日期的每一行,然后连接到过程ID正确的位置,您应该拥有它。我明天再谈这个…

对不起,我忘了提到数据库,它是Oracle
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 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)