with
inputs ( patient_id, dta, drawndttm, dispdttm ) as (
select 1001, 'xhg', date '2017-03-23', date '2017-04-15' from dual union all
select 1001, 'abc', date '2017-03-30', date '2017-04-15' from dual union all
select 1001, 'xhg', date '2017-03-31', date '2017-04-15' from dual union all
select 1001, 'zz3', date '2017-04-22', date '2017-04-15' from dual union all
select 1001, 'ab3', date '2017-04-28', date '2017-04-15' from dual
)
-- End of SIMULATED inputs (for testing only, not part of the solution).
-- SQL query begins BELOW THIS LINE. Use your actual table and column names.
select patient_id, dta, drawndttm, dispdttm,
case when drawndttm < dispdttm then 'PRE' else 'POST' end as classif
from (
select patient_id, dta, drawndttm, dispdttm,
max( case when drawndttm < dispdttm then drawndttm end )
over (partition by patient_id) as max_pre,
min( case when drawndttm > dispdttm then drawndttm end )
over (partition by patient_id) as min_post
from inputs
)
where drawndttm in (max_pre, min_post)
order by patient_id, drawndttm -- if needed
;
PATIENT_ID DTA DRAWNDTTM DISPDTTM CLASSIF
---------- --- --------- --------- -------
1001 xhg 31-Mar-17 15-Apr-17 PRE
1001 zz3 22-Apr-17 15-Apr-17 POST
=If ([Drawn date] = Min([Drawn date]) In ([Patient ABO/RN]) Where ([PrePost] = "POST") )
Or ([Drawn date] = Max([Drawn date]) In ([Patient ABO/RN]) Where ([PrePost] = "PRE") )
Then "Y" Else "N"
3条答案
按热度按时间vltsax251#
看来你需要这样的东西。请注意WITH子句,我在其中创建了一些模拟输入--不完全是您的输入,但本质上类似。请注意,计算是针对每个patient_id分别完成的;在输入中,我只模拟了一个病人,但它在所有情况下都是一样的。在对基础数据的一次遍历中,我对两个组(PRE和POST)使用条件分析的min和max--MIN和MAX中的case表达式将两个组分开。然后在外部查询中,我为每个患者只选择两行。查看输出并与输入进行比较,然后根据实际的表名和列名进行调整。
未处理:如果“绘制”的日期时间与“分配”的日期时间完全相等,会发生什么情况。如果在您的数据中不能发生这种情况,那么显然,它不需要处理。
vs91vp4v2#
这可以在报告中相当容易地完成,而无需修改SQL或Universe。
我假设您需要每个患者的Pre和Post,由第一列(
Patient ABO/RH
)标识,因此这就是我在下面的公式中使用的。如果这不正确,那么只需将这些引用替换为适当的键即可。有几种方法可以做到。我在这里建议的只是为分类为Post的行获取最小Drawn日期,为分类为Pre的行获取最大Drawn日期。首先,我们创建一个指示符来标识满足该条件的行:
把这个放到你的报告块中,你的两个黄色行应该得到一个“Y”,其余的“N”。然后,您可以在块上仅对“Y”值应用过滤器,然后删除该列不显示。
fgw7neuy3#
我找到了解决问题的办法。具体如下:
我创建了三个变量:
Max Accession: =Max([Accession]) Where ([Variables].[Pre/Post] = "PRE") In ([Patient Birth Date])
Min Accession: =Min([Accession]) Where ([Variables].[Pre/Post] = "POST") In ([Patient Birth Date])
Accession Min/Max= If ([Accession]=[Min accession])Then 1 ElseIf ([Accession] = [Max accession]) Then 2 Else 0
(这将给予最小值1,然后给最大值2,最后给其余的0)最后一步:我将第三个变量应用到表中,条件是选择所有大于0的变量。
注意事项:
1.在前休息和后休息的加入是一种由低到高的数字
1.由于我们在DEV环境中没有患者姓名或MRN,我给出了患者出生日期,将在PROD中用患者姓名替换。