2014-02-12 4 views
1

환자 서비스 목록과 해당 서비스에 도착한 시간표가있는 표가 있습니다. 응급실 후에 첫 번째 서비스 만받을 수 있기를 원합니다. 여기에 테이블 :datetime과 관련된 MIN nvarchar 찾기

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 

나는 서비스 <이> 'H 응급 의학은'그것이 내가 필요가 무엇인가하는 순으로 서비스를 끌어 MIN (서비스)를 사용합니다. EMERGENCY MEDICINE 서비스 종료 후 최소 시간과 관련된 첫 번째 서비스가 필요합니다. 이 경우 H MEDICINE ICU가됩니다. 최소 datetimein을 기반으로 min 서비스를 가져 오도록 내 쿼리 논리를 정렬하는 방법은 무엇입니까?

감사합니다

당신은 일종의 DateTimeIn함으로써 'H 응급 의학'입력 후 발생하는 행만 아래 쿼리를 필터링 한 다음 첫 번째 ( TOP 1)를 잡아 필요
+0

이 질문에 대답 할 수있는 사용자의 주목을 받고 확률을 높이려면 [편집] 그와는 해당 언어 [태그] (HTTP를 추가해야 : //stackoverflow.com/help/tagging). 나는 이것이 SQL이라고 추측 할 것입니다. 그렇다면 사용중인 SQL DB를 나타내는 태그를 추가하십시오. – Dukeling

+0

환자는 여러 개의 "H 비상 의학"항목을 가질 수 있습니까? 그렇다면 검색 할 결과는 무엇입니까? –

+0

질문을 파기하지 마십시오. 유효한 이유가 삭제되어야 할 경우, 게시물을 중재자주의를 위해 플래그를 지정하거나 페이지 하단의 연락처 링크를 사용하십시오. – theB

답변

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 
0

하지만이 개 긴급 기록이 서로 옆에 발생하면 다른 답이 정답을 반환하지 않습니다 내게 도청 : 의사 코드 솔루션은 다음과 유사합니다. 첫 번째 기록은 2 개의 비상 사태 사이에 비 긴급 기록이 없기 때문에 2 번째 기록을 null 대신 잘못 표시합니다. 이 쿼리를 찾다가 다른 쿼리를 찾았으므로 다른 사람들이이 문제를 발견했을 때를 대비하여 업데이트를 제공하고 싶었습니다.

아래 쿼리는 CROSS APPLYROW_NUMBER 대신 OUTER APPLY을 사용하여 바로 다음 서비스를 제공합니다.

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