【问题标题】:find the latest appointment date for the same person查找同一人的最新约会日期
【发布时间】:2021-01-27 16:02:14
【问题描述】:

我想创建一个新列,显示同一 HC_Number 的最新约会日期。示例:HC_Number-2552 在 12 月 2 日、12 月 7 日和 12 月 25 日有 3 个约会。因此,显示最新约会的新列将显示 12 月 25 日,同时显示 12 月 2 日和 7 日的记录。

Select 
a.HC_NUMBER
,a.APPOINTMENT_TYPE_FULL
,a.APPOINTMENT_DATE
,a.person_id
,a.APPT_BOOKED_BY

FROM [HIM_Clinical].[dbo].[APPOINTMENT_DATA] a (nolock) -----Main Data----

left join [ODS_CCL].[dbo].[ODS_CCL_ENCOUNTER] e (nolock) on a.ENCNTR_ID=e.ENCNTR_ID

WHERE a.APPOINTMENT_TYPE_FULL like '%Smart Checkup%'
AND a.Appointment_Status IN ('Checked Out','Checked In','No Show','Confirmed')
AND a.APPOINTMENT_DATE>='2020-12-01' AND a.APPOINTMENT_DATE<='2020-12-31'

【问题讨论】:

  • 您的 DBMS 是什么?从 SQL 来看,这看起来像 SQL Server。这个对吗?请始终使用您正在使用的 DBMS 标记 SQL 问题,因为答案可能很大程度上取决于此。对于许多 DBMS,您甚至可以标记您正在使用的版本以进一步帮助我们。例如,此请求的标签可以是 sql sql-server sql-server-2017
  • 附带说明:您在桌子上使用nolock 的原因是什么?您是在尝试解决某个问题,还是仅仅因为您在其他地方看到过这样做?您可能应该删除它。阅读sentryone.com/blog/aaronbertrand/bad-habits-nolock-everywhere
  • 您可以使用外部应用,它将查询每个 hc 号码的最大约会日期值select hc_number, m.lastappointmentdate from yourtable a outer apply ( select top 1 m.appointment_date as lastappointmentdate from yourtable b on b.hc_number = a.hc_number order by appointment_date desc) m

标签: sql


【解决方案1】:

您可以使用OVER Clause (Transact-SQL) 获取每个 HC_NUMBER 的最新约会日期列和MAX(a.APPOINTMENT_DATE) OVER(PARTITION BY a.HC_NUMBER) AS LATEST_APPOINTMENT_DATE

尝试如下。

Select a.HC_NUMBER
        ,a.APPOINTMENT_TYPE_FULL
        ,a.APPOINTMENT_DATE
        ,a.person_id
        ,a.APPT_BOOKED_BY
        ,MAX(a.APPOINTMENT_DATE) OVER(PARTITION BY a.HC_NUMBER) AS LATEST_APPOINTMENT_DATE

FROM [HIM_Clinical].[dbo].[APPOINTMENT_DATA] a (nolock) -----Main Data----

left join [ODS_CCL].[dbo].[ODS_CCL_ENCOUNTER] e (nolock) on a.ENCNTR_ID=e.ENCNTR_ID

WHERE a.APPOINTMENT_TYPE_FULL like '%Smart Checkup%'
    AND a.Appointment_Status IN ('Checked Out','Checked In','No Show','Confirmed')
    AND a.APPOINTMENT_DATE>='2020-12-01'
    AND a.APPOINTMENT_DATE<='2020-12-31'

或者,您可以将inner sql 查询与GROUP BY HC_NUMBERMAX(APPOINTMENT_DATE) 一起使用,然后将其与您的表连接,如下所示。

Select a.HC_NUMBER
        ,a.APPOINTMENT_TYPE_FULL
        ,a.APPOINTMENT_DATE
        ,a.person_id
        ,a.APPT_BOOKED_BY
        ,latest.APPOINTMENT_DATE AS LATEST_APPOINTMENT_DATE

FROM [HIM_Clinical].[dbo].[APPOINTMENT_DATA] a (nolock) -----Main Data----

INNER JOIN (
    SELECT HC_NUMBER, MAX(APPOINTMENT_DATE) AS APPOINTMENT_DATE
    FROM [HIM_Clinical].[dbo].[APPOINTMENT_DATA] (nolock)
    GROUP BY HC_NUMBER
) latest ON latest.HC_NUMBER = a.HC_NUMBER

left join [ODS_CCL].[dbo].[ODS_CCL_ENCOUNTER] e (nolock) on a.ENCNTR_ID=e.ENCNTR_ID

WHERE a.APPOINTMENT_TYPE_FULL like '%Smart Checkup%'
    AND a.Appointment_Status IN ('Checked Out','Checked In','No Show','Confirmed')
    AND a.APPOINTMENT_DATE>='2020-12-01'
    AND a.APPOINTMENT_DATE<='2020-12-31'

【讨论】:

  • 您在第二个查询中缺少 MAX(APPOINTMENT_DATE) 的别名。
  • 这项工作,但我们也可以修改它以识别任何未来的约会吗?如果同一位患者在 2 月份有一个应用程序。
  • 第二次查询也将在 2 月获得 appt。如果需要,在inner query 中添加必要条件。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多