2013-05-20 2 views
1

я уверен, что я знаю, как это сделать, но мой мозг выпускающая меня прямо сейчасВозврат только первый результат для Дата

Возьмите этот пример таблицы показывает важные знаки показания, взятые у пациентов, в разное время день:

enter image description here

Как вернуть только первый запись на каждый день? Так что я в конечном итоге с результирующего набора, как это:

enter image description here

Имейте в виду, что записи не может быть удобно в хронологическом порядке в таблице, как в этом примере. Я просто хочу, чтобы запрос нашел самое низкое значение в столбце ReadingTimestamp для каждого идентификатора пациента и показывал соответствующую температуру, импульс и дыхание для этой метки времени.

ответ

1
select y1.* from your_table y1 
inner join 
(
    select patientid, min(readingtimestamp) as ts 
    from your_table 
    group by date(readingtimestamp), patientid 
) y2 on y2.patientid = y1.patientid 
    and y2.ts = y1.readingtimestamp 
+0

Это то, что я понимаю наиболее легко, и у меня это работает, поэтому я отметил его как ответ. Я должен сказать, что запрос не работает быстро, хотя! –

+0

Могу ли я добавить, что этот код не работает на Sql Server .... 'Date' не является допустимой функцией. Используйте 'Convert (date, readingTimestamp)'. – KekuSemau

+0

@PhilipStratford: проблема с производительностью заключается в необходимости функции для извлечения даты из даты и времени. Это делает индексы бесполезными. Если вам нужно ускорить это, вы должны подумать о разделении даты и времени на 2 столбца: дату и время. –

1

Как бы это сказать ... но с суб-запроса, чтобы устранить все записи для одного, который является первым один для каждого пациента и кроме даты ...

Select * From yrTable t 
Where readingtimestamp = 
     (Select Min(readingtimestamp) 
     From yrTable 
     Where PatientId = t.patientId 
      And DateDiff(day, readingtimestamp, t.readingtimestamp) = 0) 
+0

считываниеtimestamp, вместо того, чтобы читатьtimestamp. ? – Beth

+0

@beth, Thx для просмотра опечатка! –

1
Select PatitentId, ReadingTimeStamp, Temperature,Pulse Respiration from 
(Select Row_Number() Over(Partition By PatitentId order by ReadingTimeStamp) as Row,* 
from TableName 
) T where Row=1 
Смежные вопросы