oracle 如何在BusinessObjects Web Intelligence中的表中获得MIN和MAX日期(当表有中断时)?

up9lanfz  于 2023-05-16  发布在  Oracle
关注(0)|答案(3)|浏览(106)

我在webi中创建了一个报告,其中我有患者数据,分为两部分测试后和测试前,每个部分都有多个绘制DTTM(多个结果)和一个分配事件DTTM。
业务用户不需要所有绘制的日期时间或结果,但需要测试后的最小绘制日期时间和测试前的最大绘制日期时间。在所附的图片中,我只想要以黄色突出显示的行,而不是其余的信息。

我也在宇宙级开放的解决方案-信息设计工具。
环境:Web Intelligence 4.1 SP 8、IDT 4.1和数据库Oracle

vltsax25

vltsax251#

看来你需要这样的东西。请注意WITH子句,我在其中创建了一些模拟输入--不完全是您的输入,但本质上类似。请注意,计算是针对每个patient_id分别完成的;在输入中,我只模拟了一个病人,但它在所有情况下都是一样的。在对基础数据的一次遍历中,我对两个组(PRE和POST)使用条件分析的min和max--MIN和MAX中的case表达式将两个组分开。然后在外部查询中,我为每个患者只选择两行。查看输出并与输入进行比较,然后根据实际的表名和列名进行调整。
未处理:如果“绘制”的日期时间与“分配”的日期时间完全相等,会发生什么情况。如果在您的数据中不能发生这种情况,那么显然,它不需要处理。

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
vs91vp4v

vs91vp4v2#

这可以在报告中相当容易地完成,而无需修改SQL或Universe。
我假设您需要每个患者的Pre和Post,由第一列(Patient ABO/RH)标识,因此这就是我在下面的公式中使用的。如果这不正确,那么只需将这些引用替换为适当的键即可。
有几种方法可以做到。我在这里建议的只是为分类为Post的行获取最小Drawn日期,为分类为Pre的行获取最大Drawn日期。首先,我们创建一个指示符来标识满足该条件的行:

=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"

把这个放到你的报告块中,你的两个黄色行应该得到一个“Y”,其余的“N”。然后,您可以在块上仅对“Y”值应用过滤器,然后删除该列不显示。

fgw7neuy

fgw7neuy3#

我找到了解决问题的办法。具体如下:
我创建了三个变量:

  1. Max Accession: =Max([Accession]) Where ([Variables].[Pre/Post] = "PRE") In ([Patient Birth Date])
  2. Min Accession: =Min([Accession]) Where ([Variables].[Pre/Post] = "POST") In ([Patient Birth Date])
  3. 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中用患者姓名替换。

相关问题