根据我原始帖子上两条评论的输入,我做了一个更改并在下面创建了一个版本的脚本。以下所有内容称为T13,并与另一个表连接。它奏效了。也许有一种更有效的方法,但它有效。然后,我唯一做的就是添加“UNION ALL”部分。从那时起,我不断收到以下错误:
错误: ORA-00911:无效字符 00911. 00000 - “无效字符” *原因:标识符可能不以除以外的任何ASCII字符开头 字母和数字。第一个之后也允许$#_ 字符。双引号括起来的标识符可能包含 除了双引号之外的任何字符。替代报价 (q'#...#')不能使用空格,制表符或回车符 分隔符。对于所有其他上下文,请参阅SQL语言 参考手册。 *行动: 行错误:143列:27
我追逐错误并重新编写相同的代码,然后再次使用不同的行和列弹出。
-
以下是我试图做的原始帖子。
以下脚本旨在为每个model.js
提供yes
或no
。问题是AN_52_ENC_CSN_ID
可能在我的时间限制之外发生了。结果是多个medication_ID
其中一个AN_52_ENC_CSN_ID
,其余yes
。如果在列出的时间限制中出现no
,我怎么能只有AN_52_ENC_CSN_ID
yes
,no
。我想过一种方法来计算包含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
答案 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语句变得更容易,使其更小!