2015-01-07 2 views
0

Я могу получить самую последнюю дату, но я не смог получить Минимальное значение. то, что я пытаюсь получить здесь, я хочу показать Минимальное значение для каждого findingAbbr для каждого пациента с их последней датой создания и временем этого минимального значения. Может кто-нибудь, пожалуйста, предложите мне, что я делаю неправильно с этим вопросом?Как получить значение MIN и самую последнюю дату [Sql Server 2008]

Благодарим за помощь!

WITH cteRankedData As 
(
    SELECT DISTINCT 
     a.AccountID 
     ,e.FindingAbbr 
     ,min(e.Value) as Value 
     ,e.CreationTime 
     ,ROW_NUMBER() OVER (PARTITION BY a.AccountID, e.FindingAbbr ORDER BY e.CreationTime DESC) As RN 

FROM  dbo.PatientVisitInfo a with (nolock) 
JOIN  dbo.Assessment d with (nolock) ON a.PatientVisit_oid = d.PatientVisit_oid 
JOIN  dbo.Observation e with (nolock) ON e.AssessmentID = d.AssessmentID 
WHERE 
     a.VisitTypeCode='IP' 
    AND a.VisitEndDateTime is null 
    AND e.Value <> '' 
    AND e.FindingAbbr IN ('A_PEEPSet','A_KR_RT_FI02%','A_FIO2%Set','A_FIO2%', 'A_Vent Mode') 
    AND e.CreationTime >= DATEADD(d,-1, GETDATE()) 
    group by a.AccountID ,e.FindingAbbr, e.CreationTime) 
SELECT 
     AccountID 
     ,FindingAbbr 
     ,Value 
     ,CreationTime 


FROM 
    cteRankedData 
WHERE 
    RN = 1 

ORDER BY 
    AccountID 
    ,CreationTime 
; 

Результат я получаю:

AccountID FindingAbbr Value CreationTime 
1   _FIO2%  40 1/7/15 1:55 PM 
2   A_FIO2%  60 1/7/15 8:20 AM 
2   A_FIO2%Set 60 1/7/15 9:47 AM 
2   A_PEEPSet  8 1/7/15 9:47 AM 
2   A_Vent Mode CMV 1/7/15 9:47 AM 
3   A_FIO2%Set 70 1/7/15 7:21 AM 
4   A_KR_RT_FI02% 30 1/6/15 2:54 PM 
4   A_FIO2%  30 1/7/15 9:35 AM 
4   A_FIO2%Set 45 1/7/15 10:22 AM 
4   A_PEEPSet  5 1/7/15 10:22 AM 
4   A_Vent Mode CMV 1/7/15 10:22 AM 

все результаты:

AccountID FindingAbbr Value CreationTime 
1   A_FIO2%  40 1/7/15 1:55 PM 
2   A_FIO2%  60 1/7/15 8:20 AM 
2   A_FIO2%  60 1/7/15 8:20 AM 
2   A_FIO2%  100 1/7/15 1:31 AM 
2   A_FIO2%  100 1/7/15 3:30 AM 
2   A_FIO2% Other:70 1/7/15 4:11 AM 
2   A_FIO2%Set 60 1/7/15 3:49 AM 
2   A_FIO2%Set 60 1/7/15 9:45 AM 
2   A_FIO2%Set 60 1/7/15 9:47 AM 
2   A_FIO2%Set 100 1/7/15 1:29 AM 
2   A_PEEPSet  8 1/7/15 1:29 AM 
2   A_PEEPSet  8 1/7/15 9:47 AM 
2   A_PEEPSet  5 1/7/15 9:45 AM 
2   A_PEEPSet  8 1/7/15 3:49 AM 
2   A_Vent Mode CMV 1/7/15 3:49 AM 
2   A_Vent Mode CMV 1/7/15 9:45 AM 
2   A_Vent Mode CMV 1/7/15 9:47 AM 
2   A_Vent Mode CMV 1/7/15 1:29 AM 
3   A_FIO2%Set 70 1/6/15 3:09 PM 
3   A_FIO2%Set 70 1/7/15 7:21 AM 
4   A_FIO2%  30 1/7/15 4:26 AM 
4   A_FIO2%  30 1/7/15 9:35 AM 
4   A_FIO2%Set 45 1/7/15 9:53 AM 
4   A_FIO2%Set 45 1/7/15 10:22 AM 
4   A_FIO2%Set 45 1/7/15 3:55 AM 
4   A_FIO2%Set 45 1/6/15 7:22 PM 
4   A_FIO2%Set 45 1/6/15 11:02 PM 
4   A_KR_RT_FI02% 30 1/6/15 2:54 PM 
4   A_PEEPSet  5 1/6/15 7:22 PM 
4   A_PEEPSet  5 1/6/15 11:02 PM 
4   A_PEEPSet  5 1/7/15 3:55 AM 
4   A_PEEPSet  5 1/7/15 10:22 AM 
4   A_PEEPSet  5 1/7/15 9:53 AM 
4   A_Vent Mode CMV 1/7/15 9:53 AM 
4   A_Vent Mode CMV 1/7/15 10:22 AM 
4   A_Vent Mode CMV 1/7/15 3:55 AM 
4   A_Vent Mode CMV 1/6/15 11:02 PM 
4   A_Vent Mode CMV 1/6/15 7:22 PM 
4   A_Vent Mode CPAP 1/6/15 2:54 PM 

Результат, я хочу:

AccountID FindingAbbr Value CreationTime 
1   A_FIO2%  40 1/7/15 1:55 PM 
2   A_FIO2%  60 1/7/15 8:20 AM 
2   A_FIO2%Set 60 1/7/15 9:47 AM 
2   A_PEEPSet  5 1/7/15 9:45 AM 
2   A_Vent Mode CMV 1/7/15 9:47 AM 
3   A_FIO2%Set 70 1/7/15 7:21 AM 
4   A_KR_RT_FI02% 30 1/6/15 2:54 PM 
4   A_FIO2%  30 1/7/15 9:35 AM 
4   A_FIO2%Set 45 1/7/15 10:22 AM 
4   A_PEEPSet  5 1/7/15 10:22 AM 
4   A_Vent Mode CMV 1/7/15 10:22 AM 

ответ

0

Вместо разделения вашего минимального значения и максимального CreationTime , почему бы не объединить их как в ROW_NU MBER() функция оконного

ROW_NUMBER() OVER (PARTITION BY a.AccountID, e.FindingAbbr 
ORDER BY e.Value, e.CreationTime DESC) 

ROW_NUMBER() 1 будет самое позднее время создания самого низкого значения для данного конкретного ACCOUNTID и FindingAbbr.

+0

Большое спасибо !!!! –

0

Вы были близки. Удалите min на столбце Value в своем ците, добавьте e.Value в group by и добавьте value в свой номер строки_1 для столбца RN. Это должно дать вам минимальное значение для каждого findAbbr, а также самую последнюю дату.

WITH cteRankedData As 
(
    SELECT DISTINCT 
     a.AccountID 
     ,e.FindingAbbr 
     ,e.Value as Value 
     ,e.CreationTime 
     ,ROW_NUMBER() OVER (PARTITION BY a.AccountID, e.FindingAbbr ORDER BY e.Value ASC, e.CreationTime DESC) As RN 
    FROM  dbo.PatientVisitInfo a with (nolock) 
    JOIN  dbo.Assessment d with (nolock) ON a.PatientVisit_oid = d.PatientVisit_oid 
    JOIN  dbo.Observation e with (nolock) ON e.AssessmentID = d.AssessmentID 
    WHERE 
      a.VisitTypeCode='IP' 
     AND a.VisitEndDateTime is null 
     AND e.Value <> '' 
     AND e.FindingAbbr IN ('A_PEEPSet','A_KR_RT_FI02%','A_FIO2%Set','A_FIO2%', 'A_Vent Mode') 
     AND e.CreationTime >= DATEADD(d,-1, GETDATE()) 
    GROUP BY a.AccountID ,e.FindingAbbr, e.CreationTime, e.Value 
) 
SELECT 
    AccountID 
    ,FindingAbbr 
    ,Value 
    ,CreationTime 
FROM 
    cteRankedData 
WHERE 
    RN = 1 
ORDER BY 
    AccountID 
    ,CreationTime 
; 
+0

Спасибо большое !!!! –

Смежные вопросы