2016-01-26 191 views
1

我想向表中添加其他(缺失)行。 现有情况:我有一张病人表,其中有一个注册日期,我计算了病人已经注册了多长时间(“TimeInProgram”)。现在,我汇总了这一点,以获取当前处于此期间的患者人数(请参阅计数 - >属性“患者”)。最后,我总结了一个窗口函数来获取在特定时期内已经有WERE的患者人数。SQL:添加缺少的行

SELECT aggregation.*, SUM("Patients") OVER() "All", SUM("Patients") OVER (ORDER BY "TimeInProgram" DESC ROWS UNBOUNDED PRECEDING) "PatientsCounterInTime" FROM (
SELECT COUNT(DISTINCT "PatientID") "Patients", "TimeInProgram" FROM (
SELECT 
    pat."PatientID", 
    ROUND(((DAYS_BETWEEN(pat."RegisteredOnDate", NOW())+1)/7.0), 0, 'ROUND_UP') "TimeInProgram" 
    FROM t_patient pat 
    ORDER BY "PatientID" 
) data 
GROUP BY "TimeInProgram" 
ORDER BY "TimeInProgram" 
) aggregation 

结果,你可以在这里看到:

(PatientsCounterInTime PLUS Patients of the following row is the value of PatientsCounterInTime of the following row.)

PatientsCounterInTime PLUS以下行的患者在以下row.You的PatientsCounterInTime的值可以看到的问题:有一些“ TimeInProgram“ - 周如第4周或第5周缺失,因为此时没有患者在此期间。所以我想添加缺少的行。 “PatientsCounterInTime”的值在第4周,第5周应为162.“患者”当然为0.

我使用HANA作为数据库。

提前致以亲切的问候和感谢。

UPDATE:

SELECT "TiP" "TimeInProgram", "Patients", "PatientsCounterInTime" FROM (
     SELECT aggregation.*, SUM("Patients") OVER() "All", SUM("Patients") OVER (ORDER BY "TimeInProgram" DESC ROWS UNBOUNDED PRECEDING) "PatientsCounterInTime" FROM (
     SELECT COUNT(DISTINCT "PatientID") "Patients", "TimeInProgram" FROM (
     SELECT 
      pat."PatientID", 
      ROUND(((DAYS_BETWEEN(pat."RegisteredOnDate", NOW())+1)/7.0), 0, 'ROUND_UP') "TimeInProgram" 
      FROM "t_patient" pat 
      ORDER BY "PatientID" 
     ) data 
     GROUP BY "TimeInProgram" 
     ORDER BY "TimeInProgram" 
     ) aggregation 
    ) 
    RIGHT JOIN "t_time_in_program" t ON "TimeInProgram" = t."TiP"; 

enter image description here

(以下行PatientsCounterInTime PLUS患者是下一行的PatientsCounterInTime的值。)

+2

您需要一个包含所有星期的日历表,基本上是一个单列,其中包含1到48,并且在该列上加上LEFT JOIN – Mihai

+1

除了Mihai所说的内容之外,您还必须使用LEAD或LAG来获取最后一个部分计数器时间加入时(SINCE在离开后会有一个空值) – sagi

+0

谢谢你的帮助!我加入了桌面并更新了上面的帖子。我不确定现在如何使用LEAD/LAG填写缺席专栏的数据。任何提示再次? @sagi – ScientiaEtVeritas

回答

0

您可以找到“_SYS_BI时间表“架构。 如果没有,here是有用的文章

以下是如何使用它的示例。比方说,你想显示期从2000年到目前的年份:

WITH dataset AS (
    Select '2016' as YEAR, '216' AS PATIENTS FROM DUMMY 
    union all 
    Select '2010' as YEAR, '200' AS PATIENTS FROM DUMMY 
) 
SELECT 
     distinct tdim.year, 
     case when dataset.PATIENTS is null then 0 else dataset.PATIENTS end 
    FROM "_SYS_BI"."M_TIME_DIMENSION_MONTH" tdim 
left outer join dataset on tdim.year = dataset.year 
where tdim.year >=2000 and tdim.year <= YEAR(CURRENT_DATE) 

将是巨大的,如果你可以发送表中创建报表+些插入的数据,所以我可能是强麦,以帮助你。