【问题标题】:SQL Grouping and Counting based on dates基于日期的 SQL 分组和计数
【发布时间】:2017-03-15 12:56:24
【问题描述】:

在这里无处可去,似乎很简单。

测试数据为:

declare @table table(SpellAdminsionDate datetime, SpellDischargeDate datetime, Pat_code varchar(10))
 insert into @table (SpellAdminsionDate, SpellDischargeDate, Pat_code) values('2016-09-12 15:55:00:000','2016-09-19 20:20:00:000','HEY3052275')
 insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-07 17:17:00:000','2016-09-17 18:40:00:000','HEY0810155')
 insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-14 16:50:00:000','2016-09-17 18:01:00:000','HEY1059266')
 insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-15 02:47:00:000','2016-09-15 17:28:00:000','HEY0742883')
 insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-08-27 00:11:00:000','2016-09-14 12:49:00:000','HEY3050628')
 insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-10 12:24:00:000','2016-09-13 20:00:00:000','HEY0912392')
 insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-12 12:51:00:000','2016-09-13 19:55:00:000','HEY0908691')

 Select * from @table`

下面是显示相同内容的简单代码:

SELECT c.SpellAdmissionDate, 
       c.SpellDischargeDate,
       c.Pat_Code
FROM [CommDB].[dbo].[vwCivicaSLAM1617Live] c
WHERE c.Hrg_Code like 'VA%'
    and c.Pat_Code like 'HEY%'
ORDER BY c.SpellDischargeDate desc

我所追求的只是每天活跃患者的COUNT,例如,在那个日期取12/09/2016,结果将是5(基于测试数据),因为另外两个在12 日。

如果它更容易,我确实有一个名为 DATE_REFERENCE 的日期参考表,其中包含可供我使用的每个日期。

【问题讨论】:

  • 将一些DATE_REFERENCE 表添加到您的问题中,您会很快得到答案。

标签: sql-server tsql date count grouping


【解决方案1】:

这是你想要的吗?

SELECT dr.date,
       (SELECT COUNT(*)
        FROM [CommDB].[dbo].[vwCivicaSLAM1617Live] c
        WHERE dr.date between c.SpellAdmissionDate and c.SpellDischargeDate) as cnt_per_day
FROM DATE_REFERENCE dr

将您想要的过滤器添加到相关查询中。

【讨论】:

    【解决方案2】:

    您可以通过加入您的日期参考表并按不同的患者参考计数来实现此目的

    SELECT
     dateRef
    ,COUNT(DISTINCT Pat_Code) AS PatCount
    FROM @table t
    RIGHT JOIN @date_reference
    ON SpellAdminsionDate <= dateRef
    AND SpellDischargeDate >= dateRef
    GROUP BY dateRef;
    

    【讨论】:

      【解决方案3】:

      我认为您需要将 DATE_REFERENCE 表带到查询中,如果它包含您需要根据他们计算患者的所有日期,但这里是一个示例,说明如何仅从该表中获得所需的结果

        Select DISTINCT c.SpellAdmissionDate, count(c.Pat_code) as PCounter 
        From [CommDB].[dbo].[vwCivicaSLAM1617Live] c
        GROUP BY c.SpellAdmissionDate
        ORDER BY c.SpellAdmissionDate desc
      

      【讨论】:

      • 永远不要以这种方式使用select distinctgroup by...根据定义,该组必须产生独特的行,使select distinct 完全冗余
      【解决方案4】:

      每个日期的活跃患者数可以通过(对于此处提供的临时数据)来实现

        SELECT DISTINCT CAST(T1.SPELLADMINSIONDATE AS DATE)
        AdmissionDate,PATIENTS.TotalActive
        FROM @TABLE T1 
        CROSS APPLY (SELECT COUNT(*)TotalActive FROM @TABLE T2 WHERE
        CAST(T2.SPELLADMINSIONDATE AS DATE)<=CAST(T1.SPELLADMINSIONDATE AS DATE))    PATIENTS
      

      【讨论】:

        【解决方案5】:

        考虑到一天可能没有患者,那么您希望使用日期参考表作为主要并左连接到患者信息。您没有识别列名,所以我只使用了 [datecol]。

        SELECT
              d.[datecol]                 the_date
            , count(DISTINCT c.Pat_Code) num_patients
        FROM DATE_REFERENCE d
        LEFT JOIN [CommDB].[dbo].[vwCivicaSLAM1617Live] c
                    ON d.[datecol] BETWEEN c.SpellAdmissionDate AND c.SpellDischargeDate
                    AND c.Hrg_Code LIKE 'VA%'
                    AND c.Pat_Code LIKE 'HEY%'
        GROUP BY 
              d.[datecol]
        ORDER BY
              d.[datecol] DESC
        

        我怀疑可能比要求的更多,但没有样本数据和预期结果,很难知道你真正需要什么。

        注意。我假设该 date_reference 表中的日期是午夜 (00:00:00) 或具有日期数据类型(没有小时/分钟等)

        【讨论】:

        • 这看起来很接近我现在正在验证是 100%
        • Ding Dang Do,这正是我一直在寻找的简单解决方案,并且知道在某个地方,谢谢您
        • 太棒了。我想您随后会将其勾选为解决方案,以便其他人知道该问题已得到解答。
        • 你还会再来吗?也许您会考虑“勾选”解决方案?它不花钱 - 但我们的努力和帮助得到了一点认可
        • 道歉我以前从未使用过它,并且正在寻找“已解决的问题”并没有发现它是明显的勾号的东西。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多