限制为具有多个子句的CASE的唯一ID

时间:2016-03-24 17:02:44

标签: oracle join subquery case union-all

根据我原始帖子上两条评论的输入,我做了一个更改并在下面创建了一个版本的脚本。以下所有内容称为T13,并与另一个表连接。它奏效了。也许有一种更有效的方法,但它有效。然后,我唯一做的就是添加“UNION ALL”部分。从那时起,我不断收到以下错误:

错误: ORA-00911:无效字符 00911. 00000 - “无效字符” *原因:标识符可能不以除以外的任何ASCII字符开头            字母和数字。第一个之后也允许$#_            字符。双引号括起来的标识符可能包含            除了双引号之外的任何字符。替代报价            (q'#...#')不能使用空格,制表符或回车符            分隔符。对于所有其他上下文,请参阅SQL语言            参考手册。 *行动: 行错误:143列:27

我追逐错误并重新编写相同的代码,然后再次使用不同的行和列弹出。

-

以下是我试图做的原始帖子。

以下脚本旨在为每个model.js提供yesno。问题是AN_52_ENC_CSN_ID可能在我的时间限制之外发生了。结果是多个medication_ID其中一个AN_52_ENC_CSN_ID,其余yes。如果在列出的时间限制中出现no,我怎么能只有AN_52_ENC_CSN_ID yesno。我想过一种方法来计算包含AN_52_ENC_CSN_ID然后在yes上分组的唯一AN_52_ENC_CSN_ID行,但我无法绕过它。

有任何帮助吗?

SELECT T3.AN_52_ENC_CSN_ID, T3.AN_STOP_DATETIME, (T3.AN_STOP_DATETIME +.125),
CASE
  WHEN TOTAL_ADMIN_COUNT > 0 THEN 'YES'
  ELSE 'NO' END AS PONV
From (SELECT
  CLARITY.F_AN_RECORD_SUMMARY.AN_52_ENC_CSN_ID,
  CLARITY.F_AN_RECORD_SUMMARY.AN_STOP_DATETIME,
  CLARITY.F_AN_RECORD_SUMMARY.AN_EPISODE_ID
    FROM CLARITY.OR_LOG
    INNER JOIN CLARITY.F_AN_RECORD_SUMMARY
    ON CLARITY.OR_LOG.LOG_ID = CLARITY.F_AN_RECORD_SUMMARY.LOG_ID
    INNER JOIN CLARITY.V_LOG_BASED
    ON CLARITY.OR_LOG.LOG_ID = CLARITY.V_LOG_BASED.LOG_ID
    INNER JOIN CLARITY.PATIENT
    ON CLARITY.F_AN_RECORD_SUMMARY.AN_PAT_ID = CLARITY.PATIENT.PAT_ID
    WHERE CLARITY.OR_LOG.LOC_ID             IN (4060020, 4060021)
    and (CLARITY.F_AN_RECORD_SUMMARY.AN_STOP_DATETIME - CLARITY.F_AN_RECORD_SUMMARY.AN_START_DATETIME) *24*60 > 0
) T10

LEFT JOIN
(
SELECT  AN_EPISODE_ID,
        SUM(MedCount) AS TOTAL_ADMIN_COUNT
FROM (SELECT AN_EPISODE_ID, COUNT(ord.ORDER_MED_ID) as MedCount
      FROM F_AN_RECORD_SUMMARY An
      inner join MAR_ADMIN_INFO Mar
      on An.AN_52_ENC_CSN_ID = Mar.MAR_ENC_CSN
      inner join ORDER_MED Ord
      on Mar.ORDER_MED_ID = Ord.ORDER_MED_ID
      inner join V_LOG_TIMING_EVENTS ORL
      on An.LOG_ID = ORL.LOG_ID
      where Ord.MEDICATION_ID IN (104661, 2787)
      and Mar.TAKEN_TIME > AN.AN_STOP_DATETIME -- ANESTHESIA STOP TIME
      and Mar.TAKEN_TIME < (AN.AN_STOP_DATETIME +.125) -- ANESTHESIA STOP TIME PLUS 3 HOURS
      group by An.AN_EPISODE_ID
      Union all
      select AN_EPISODE_ID, COUNT(ord2.ORDER_MED_ID) as MedCount
      from F_AN_RECORD_SUMMARY An2
      inner join AN_HSB_LINK_INFO Link2
      on An2.AN_52_ENC_CSN_ID=Link2.AN_52_ENC_CSN_ID
      inner join MAR_ADMIN_INFO Mar2
      on Link2.AN_BILLING_CSN_ID = Mar2.MAR_ENC_CSN
      inner join ORDER_MED Ord2
      on Mar2.ORDER_MED_ID = Ord2.ORDER_MED_ID
      inner join V_LOG_TIMING_EVENTS ORL2
      on An2.LOG_ID = ORL2.LOG_ID
      where Ord2.MEDICATION_ID IN (104661, 2787)
      and Mar2.TAKEN_TIME > AN.AN_STOP_DATETIME -- ANESTHESIA STOP TIME
      and Mar2.TAKEN_TIME < (AN.AN_STOP_DATETIME +.125) -- Stop +3 HOURS
      Group by An2.AN_EPISODE_ID
) 
GROUP BY AN_52_ENC_CSN_ID
)T11
ON T10. AN_52_ENC_CSN_ID = T11. AN_52_ENC_CSN_ID

2 个答案:

答案 0 :(得分:0)

使用公用表表达式对同一数据集尝试LOJ。这不是测试,只是一个想法

WITH temp_calc AS ( your query... ) 
SELECT          t1.*, 
                CASE  WHEN t2.ponv_prophylaxis = 'yes' THEN 'yes' ELSE 'no' 
                END AS new_ponv_prophylaxis 
FROM            temp_calc t1 
LEFT OUTER JOIN temp_calc t2 
ON              t1.an_52_enc_csn_id= t2.an_52_enc_csn_id AND other joins...

答案 1 :(得分:0)

您可以使用row_number分析函数计算出第一行,然后将其他所有内容设置为'no'

select an_52_enc_csn_id,
       case when row_number() over (partition by an_52_enc_csn_id order by ponv_prophylaxis desc) = 1
                 then ponv_prophylaxis
            else 'no'
       end ponv_prophylaxis
from   (select rsum.an_52_enc_csn_id,
               case when om.medication_id in ( 104661, 104662 ) 
                           and mai.taken_time > vlte.patient_in_preprocedure_dttm 
                           and mai.taken_time < vlte.patient_out_room_dttm 
                         then 'yes' 
                    else 'no' 
               end as ponv_prophylaxis 
        from   clarity.or_log olg
               inner join clarity.f_an_record_summary rsum on olg.log_id = rsum.log_id 
               inner join clarity.v_log_based vlg on olg.log_id = vlg.log_id 
               left join clarity.mar_admin_info mai on rsum.an_52_enc_csn_id = mai.mar_enc_csn 
               inner join clarity.order_med om on mai.order_med_id = om.order_med_id 
               inner join clarity.v_log_timing_events vlte on rsum.log_id = vlte.log_id 
        where  olg.loc_id in ( 4060020, 4060021 ));       

N.B。你会注意到我已经在表格中使用了别名;它使得读取和删除SQL语句变得更容易,使其更小!