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