Sql 选择最近的活动

Sql 选择最近的活动,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我正在努力获取病人手术前后的最新实验室结果;我们想得到他的血红蛋白 实验台会显示他的实验结果 问题清单将显示他的诡计 /这个例子只是以前的例子/ 假设field LAB.PATID_CD包含患者的id,您应该按如下方式更改查询,即也加入PATID_CD上的子查询。我还对MAX函数括号做了一个小的修正 SELECT L.RESULT_DE FROM LAB L INNER JOIN PROBLEM_LIST_CN PL ON L.PATID_CD = PL.PAT_ID

我正在努力获取病人手术前后的最新实验室结果;我们想得到他的血红蛋白

实验台会显示他的实验结果 问题清单将显示他的诡计

/这个例子只是以前的例子/


假设field LAB.PATID_CD包含患者的id,您应该按如下方式更改查询,即也加入PATID_CD上的子查询。我还对MAX函数括号做了一个小的修正

   SELECT L.RESULT_DE 
   FROM LAB L INNER JOIN PROBLEM_LIST_CN PL
    ON L.PATID_CD = PL.PAT_ID 
   WHERE L.PROCEDURE_DE = 'HEMOGLOBIN' 
   AND L.COLLECTION_DT = (SELECT (MAX (L.COLLECTION_DT) FROM LAB L2 WHERE L2.COLLECTION_DT < PL.NOTED_DATE AND L2.PATID_CD=l.PATID_CD) As HEMOG_BEFORE;

没有任何样本数据,很难进行测试,但类似于:

SELECT L.PATID_CD,
       MAX( L.RESULT_DE )
         KEEP ( DENSE_RANK LAST ORDER BY CASE WHEN L.COLLECTION_DT < PL.NOTED_DATE
                                              THEN L.COLLECTION_DT END NULLS FIRST )
         AS HEMOG_BEFORE,
       MAX( CASE WHEN L.COLLECTION_DT < PL.NOTED_DATE THEN L.COLLECTION_DT END )
         AS DATE_TAKEN_BEFORE,
       MAX( L.RESULT_DE )
         KEEP ( DENSE_RANK FIRST ORDER BY CASE WHEN L.COLLECTION_DT >= PL.NOTED_DATE
                                               THEN L.COLLECTION_DT END NULLS LAST)
         AS HEMOG_AFTER,
       MIN( CASE WHEN L.COLLECTION_DT >= PL.NOTED_DATE THEN L.COLLECTION_DT END )
         AS DATE_TAKEN_AFTER
FROM   LAB L
       INNER JOIN PROBLEM_LIST_CN PL
       ON ( L.PATID_CD = PL.PAT_ID )
WHERE L.PROCEDURE_DE = 'HEMOGLOBIN'
GROUP BY L.PATID_CD;

你得到的不是你想要的结果,而是什么?你应该调查滞后和超前分析函数。如果不知道表中的数据,就很难理解你需要的结果。请发布相同的样本数据格式文本,以便更好地解释预期结果的原因
SELECT L.PATID_CD,
       MAX( L.RESULT_DE )
         KEEP ( DENSE_RANK LAST ORDER BY CASE WHEN L.COLLECTION_DT < PL.NOTED_DATE
                                              THEN L.COLLECTION_DT END NULLS FIRST )
         AS HEMOG_BEFORE,
       MAX( CASE WHEN L.COLLECTION_DT < PL.NOTED_DATE THEN L.COLLECTION_DT END )
         AS DATE_TAKEN_BEFORE,
       MAX( L.RESULT_DE )
         KEEP ( DENSE_RANK FIRST ORDER BY CASE WHEN L.COLLECTION_DT >= PL.NOTED_DATE
                                               THEN L.COLLECTION_DT END NULLS LAST)
         AS HEMOG_AFTER,
       MIN( CASE WHEN L.COLLECTION_DT >= PL.NOTED_DATE THEN L.COLLECTION_DT END )
         AS DATE_TAKEN_AFTER
FROM   LAB L
       INNER JOIN PROBLEM_LIST_CN PL
       ON ( L.PATID_CD = PL.PAT_ID )
WHERE L.PROCEDURE_DE = 'HEMOGLOBIN'
GROUP BY L.PATID_CD;
SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY platin_cd ORDER BY date_after ) AS rid
  FROM   (
    SELECT l.platin_cd,
           LAG( l.result_de     ) OVER ( PARTITION BY l.platin_cd
                                         ORDER BY collection_dt ) AS hemog_before,
           LAG( l.collection_dt ) OVER ( PARTITION BY l.platin_cd
                                         ORDER BY collection_dt ) AS date_before,
           l.result_de AS hemog_after,
           l.collection_dt AS date_after,
           pl.noted_date
    FROM   LAB L
           INNER JOIN PROBLEM_LIST_CN PL
           ON ( L.PATID_CD = PL.PAT_ID )
    WHERE L.PROCEDURE_DE = 'HEMOGLOBIN'
  )
  WHERE  date_after >= noted_date
)
WHERE  rid = 1;