Oracle 限制为具有多个子句的情况下的唯一ID

Oracle 限制为具有多个子句的情况下的唯一ID,oracle,join,subquery,case,union-all,Oracle,Join,Subquery,Case,Union All,根据我最初帖子上两条评论的输入,我做了一个修改,并创建了下面脚本的一个版本。下面的所有内容都称为T13,并与另一个表左连接。它成功了。也许有一种更有效的方法,但它奏效了。然后,我做的唯一一件事就是添加UNIONALL部分。从那以后,我一直遇到以下错误: 错误: ORA-00911:无效字符 91100000-无效字符 *原因:标识符不能以任何ASCII字符开头,除非 字母和数字。$\u也允许在第一次 性格用双引号括起来的标识符可能包含 除双引号外的任何字符。替代报价 q“…”不能使用空格、制表符

根据我最初帖子上两条评论的输入,我做了一个修改,并创建了下面脚本的一个版本。下面的所有内容都称为T13,并与另一个表左连接。它成功了。也许有一种更有效的方法,但它奏效了。然后,我做的唯一一件事就是添加UNIONALL部分。从那以后,我一直遇到以下错误:

错误: ORA-00911:无效字符 91100000-无效字符 *原因:标识符不能以任何ASCII字符开头,除非 字母和数字。$\u也允许在第一次 性格用双引号括起来的标识符可能包含 除双引号外的任何字符。替代报价 q“…”不能使用空格、制表符或回车符作为 分隔符。对于所有其他上下文,请参考SQL语言 参考手册*行动: 第143行第27列出错

我追踪错误,只是重新编写相同的代码,然后它再次弹出一个不同的行和列

-

下面是我想做的事情的原始帖子

下面的脚本旨在为每个AN_52_ENC_CSN_ID给我一个是或否。问题是药物ID可能在我的时间限制之外发生。结果是多个AN_52_ENC_CSN_ID,其中一个为是,其余为否。如果在列出的时间限制内发生,我怎么能只有一个唯一的AN_52_ENC_CSN_ID为是,否则不会。我想了一种方法来计算包含“是”的唯一的an_52_ENC_CSN_ID的行数,然后在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
使用公共表表达式在同一数据集上尝试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...

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


注意,你会注意到我在表格中使用了别名;它使SQL语句更易于阅读,也使SQL语句更易于分解,使其更小

我很感激你的意见,但那不起作用。仍然有重复的52_enc行,带有yes和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 ));