【问题标题】:Finding MIN nvarchar related to datetime查找与日期时间相关的 MIN nvarchar
【发布时间】:2014-03-11 06:28:44
【问题描述】:

我有一个表格,其中包含患者服务列表以及他们何时到达该服务。我希望能够在急诊科之后只提供第一项服务。这是表格:

    Service                  DateTimeIn
    H EMERGENCY MEDICINE    2013-01-01 10:43:00.000
    H MEDICINE E            2013-01-06 23:43:00.000
    H MEDICINE E            2013-01-07 17:18:00.000
    H MEDICINE ICU          2013-01-01 15:38:00.000
    H MEDICINE ICU          2013-01-07 00:49:00.000
    H MEDICINE ICU          2013-01-08 04:36:00.000 

当我使用 MIN(service) where service 'H EMERGENCY MEDICINE' 时,它会按字母顺序提取服务,这不是我需要的。我需要与紧急医疗服务后的最短时间相关的第一项服务。在这种情况下,它将是 H MEDICINE ICU。我应该如何安排我的查询逻辑,以便它根据 min datetimein 提取 min 服务?

谢谢

【问题讨论】:

  • 为了增加引起能够回答此问题的用户注意的机会,您应该edit 它并添加适用的语言tag。我猜这是 SQL,如果是这样,还请添加一个标签来指示您正在使用的 SQL DB。
  • 一个患者可以有多个“H EMERGENCY MEDICINE”条目吗?如果是这样,您要检索什么结果?
  • 请不要破坏您的问题。如果有正当理由需要删除,请标记帖子以引起版主注意,或使用页面底部的联系链接。

标签: sql sql-server datetime min


【解决方案1】:

您需要将查询过滤到仅出现在“H EMERGENCY MEDICINE”条目之后的行,按DateTimeIn 排序,然后抓取第一个 (TOP 1)。伪代码解决方案类似于:

-- Get all Emergency visits for a given patient
WITH CTE_EmergencyVisits AS (
SELECT DateTimeIn
    FROM   [ServicesTable]
    WHERE  Services = 'H EMERGENCY MEDICINE'
    AND    [PatientFilter]
)
SELECT SVC.Service,
       SVC.DateTimeIn
-- For each emergency visit...
FROM CTE_EmergencyVisits E
-- ... get the first service that occurred afterward
CROSS APPLY (
    SELECT TOP 1
           Service,
           DateTimeIn
    FROM [ServicesTable] S
    WHERE S.[PatientIdentifier] = E.[PatientIdentifier]
    AND   S.DateTimeIn > E.DateTimeIn
    ORDER BY
          DateTimeIn ASC
) SVC

【讨论】:

    【解决方案2】:

    我知道这是旧的,但如果 2 个紧急记录彼此相邻,另一个答案不会返回正确答案,这让我很烦恼。第一条记录将错误地显示第二条记录而不是 null,因为在这种情况下,两个紧急情况之间不会有非紧急记录。我偶然发现了这个查找另一个查询,所以我想提供一个更新,以防其他人偶然发现这个。

    下面的查询使用OUTER APPLY 而不是CROSS APPLYROW_NUMBER 来获得正确的下一个服务。

    DECLARE @S TABLE (
        [Service] NVARCHAR(40),
        [DateTimeIn] DATETIME,
        [PatientId] INT
    )
    
    INSERT @S
        SELECT 'H EMERGENCY MEDICINE', '2013-01-01 10:43:00.000', 1
        UNION ALL SELECT 'H MEDICINE E', '2013-01-06 23:43:00.000', 1
        UNION ALL SELECT 'H MEDICINE E', '2013-01-07 17:18:00.000', 1
        UNION ALL SELECT 'H MEDICINE ICU', '2013-01-01 15:38:00.000', 1
        UNION ALL SELECT 'H EMERGENCY MEDICINE', '2013-01-07 1:41:00.000', 1
        UNION ALL SELECT 'H EMERGENCY MEDICINE', '2013-01-07 1:43:00.000', 1
        UNION ALL SELECT 'H MEDICINE ICU', '2013-01-07 00:49:00.000', 1
        UNION ALL SELECT 'H MEDICINE ICU', '2013-01-08 04:36:00.000', 1
    
    DECLARE @PatientId INT = 1
    ;WITH CTE AS (
        SELECT *,
            CASE WHEN S.Service = 'H EMERGENCY MEDICINE' THEN 1 ELSE 0 END AS IsEmergency,
            ROW_NUMBER() OVER ( ORDER BY DateTimeIn ) AS RowNum
        FROM @S S
        WHERE S.PatientId = @PatientId
    )
        SELECT
            E.Service,
            E.DateTimeIn,
            N.NextService,
            N.NextDateTimeIn
        FROM CTE E
            OUTER APPLY (
                SELECT TOP 1
                    Service AS NextService,
                    DateTimeIn AS NextDateTimeIn
                FROM CTE
                WHERE IsEmergency = 0
                    AND RowNum = E.RowNum + 1
            ) N
        WHERE IsEmergency = 1
    

    这将输出:

    Service                   DateTimeIn              NextService               NextDateTimeIn
    ------------------------- ----------------------- ------------------------- -----------------------
    H EMERGENCY MEDICINE      2013-01-01 10:43:00.000 H MEDICINE ICU            2013-01-01 15:38:00.000
    H EMERGENCY MEDICINE      2013-01-07 01:41:00.000 NULL                      NULL
    H EMERGENCY MEDICINE      2013-01-07 01:43:00.000 H MEDICINE E              2013-01-07 17:18:00.000
    

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2015-07-27
      • 2015-02-08
      • 2011-12-26
      • 2013-02-09
      相关资源
      最近更新 更多