需要在计数中进行子计数

时间:2016-08-31 14:56:37

标签: sql sql-server

在下文中,我们计算患者未出席医疗预约的次数(NOSHOW)。它是基于如果他们没有显示当天,那么我们从过去显示他们的计数。我怎样才能得到他们没有展示的部门?我们有6个不同的医疗部门,所以经理想要看看问题是仅针对牙科医生,还是针对所有人。这将有助于他们预订某人等。

SELECT Distinct 
    Appt_DateTime j, 
    Patient_Name j, 
    Appt_Status j,    
    Appt_Sched_Department_ID j, 
    Appt_Sched_Department_Descr j, 
    Patient_id j,  
    Patient_number j, 
    Appt_NoShow_Date j,
    ISNULL(P.NotShowCount,0) AS NotShowCount

FROM
    vwGenPatInfo vwGenPatInfo j 
    INNER JOIN vwGenPatApptInfo vwGenPatApptInfo ON vwGenPatInfo.Patient_ID=vwGenPatApptInfo.Patient_ID
    LEFT JOIN (
        SELECT Patient_ID, COUNT(Appt_Status) AS NotShowCount 
        FROM (SELECT Appt_DateTime, Appt_Status, Appt_Sched_Department_ID, Appt_Sched_Department_Descr, Appt_NoShow_Date, Patient_ID
            FROM vwGenPatapptInfo AS vwGenPatApptInfo
            WHERE      (Appt_Status = 'N') AND (Appt_DateTime < DATEADD(day,  DATEDIFF(day, 0, GETDATE()), - 1))) AS L
    GROUP BY 
        Patient_ID) AS P ON  vwGenPatInfo.Patient_ID=P.Patient_ID
    WHERE  
        vwGenPatApptInfo.Appt_Status='N'
    ORDER BY 
        vwGenPatApptInfo.Appt_Sched_Department_ID,  
        vwGenPatApptInfo.Appt_DateTime

目前的数据是这样的:最后一个数字是先前noshows的数量。所以我们想像成人医学_NS 3,Dental_NS 9那样打破这个。日期时间显示是前一天的noshow。呼叫室将呼叫他们重新安排。

Patient_Name Appt_Sched_Departmen Appt_NoShow_Date Previous No Show Count
8/31/2016 No Shows 8/30/2016
Patient_number
Sinca Blay  Adult Medicine 8/30/2016 12:05:46PM 12
Wiske Semns Adult Medicine 8/30/2016 5:25:32PM 4
Rose  Alhar Adult Medicine 8/30/2016 5:57:01PM 6

1 个答案:

答案 0 :(得分:1)

您可以使用analyticaggregateranking窗口函数。

这是一个未经测试的查询,可以为您提供一个想法:

SELECT      Patient_ID,
            Patient_Name, 
            Appt_Sched_Department_ID,
            Appt_Sched_Department_Descr,
            Appt_NoShow_Date_Today,
            Appt_NoShow_Date_Prev,
            NotShowCount
FROM       (SELECT      app.Patient_ID,
                        pat.Patient_Name,
                        app.Appt_Sched_Department_ID,
                        app.Appt_Sched_Department_Descr,
                        app.Appt_DateTime AS Appt_NoShow_Date_Today,
                        LEAD(app.Appt_DateTime) 
                            OVER (PARTITION BY app.Patient_ID 
                                  ORDER BY app.Appt_DateTime DESC) AS Appt_NoShow_Date_Prev,
                        COUNT(app.Appt_Status) 
                            OVER (PARTITION BY app.Patient_ID) AS NotShowCount,
                        ROW_NUMBER() 
                            OVER (PARTITION BY app.Patient_ID 
                                  ORDER BY app.Appt_DateTime DESC) AS rn
            FROM        vwGenPatApptInfo app
            INNER JOIN  vwGenPatInfo pat
                     ON pat.Patient_ID = app.Patient_ID
            WHERE       app.Appt_Status = 'N'
           ) AS base
WHERE       rn = 1
AND         Appt_NoShow_Date_Today >= DATEADD(day,  DATEDIFF(day, 0, GETDATE()), 0)
ORDER BY    Appt_Sched_Department_ID,
            Appt_NoShow_Date_Today

内部查询获取状态为“N”的所有记录,但添加信息:

  • Appt_NoShow_Date_Prev:如果记录按降序Appt_DateTime排序,则下一条记录的Appt_DateTime值(对于同一患者:这是“窗口”)。
  • NotShowCount:该窗口中的记录数。
  • rn:该窗口中的顺序记录编号,当记录按降序Appt_DateTime排序时。

外部查询仅保留记录rn = 1,这意味着:每位患者最近Appt_DateTime的记录。作为第二个条件,这Appt_DateTime必须是今天(在午夜之后):这确保我们只列出今天缺席的患者。