2013-09-21 3 views
-1

Я пытаюсь написать оператор выбора, чтобы получить строки с именами и статусом только для определенного TID с самым последним dateendedSQL: группа по п с агрегатной функцией

схема таблицы выглядит

ID    int 
Name   varchar(100)  
TID    int 
DateStarted  datetime  
DateEnded  datetime  
Status   int 
TestQueueTable varchar(50) 
TQDID   int 
ResultsFile  varchar(255)  
TextResultsFile varchar(255)  

Когда я пишу выбрать

select name,status,max(dateended) 
from testcasedata 
where tid='87946' 
group by name,status 

строки, извлекаемые как ниже

name         status  max(dateended) 
===================================================================== 
IntegrationPlumbingTest    2   2013-09-19 09:24:30.000 
LCEventLogger      2   2013-09-19 09:23:52.000 
NonReferralGQ_1      2   2013-09-19 09:23:06.000 
NonReferralGQ_2      2   2013-09-19 09:22:48.000 
ApplyToJobFromTGAndVerifyFrom_A  3   2013-09-20 02:17:54.000 
PostReqAndVerifyFrom_A    3   2013-09-20 01:47:33.000 
PostReqAndVerifyFrom_B    3   2013-09-20 02:04:09.000 
Verify_UploadResume     3   2013-09-19 12:21:49.000 
ApplyToJobFromAndVerifyFrom_B  2   2013-09-19 03:24:67.000 
ApplyToJobFromAndVerifyFrom_B  3   2013-09-20 02:23:05.000 

Здесь я на самом деле отображать только уникальное имя и статус, где, если статус для имени содержит 2 он должен должен показывать только эту строку в противном случае он должен отображать имя и статус группы по max(dateended)

даже последний две записи

ApplyToJobFromAndVerifyFrom_B  2   2013-09-19 03:24:67.000 
ApplyToJobFromAndVerifyFrom_B  3   2013-09-20 02:23:05.000 

также следует сгруппировать в один с последней датой.

наконец из таблицы я хочу имя, статус, dateended записи без каких-либо повторений с MaxDate

Пожалуйста, вы можете сказать мне, как поступить ..

+0

Я не уверен, что вы имеете в виду. Можете ли вы изменить свой вопрос, чтобы включить то, что вы хотите получить, чтобы мы могли видеть, как он отличается от вашей текущей попытки? – IMSoP

+0

* «... если статус для имени содержит 2, он должен отображать только эту строку ..» * Похоже, именно это и происходит сейчас. * "... в противном случае он должен отображать имя и группу статусов с помощью max (dateended) ..." * И похоже, что это именно то, что он делает сейчас. –

+0

Это правильно? «Если если имя не имеет статуса 2, его последняя запись должна быть отображена, в противном случае вместо нее будет отображаться запись состояния 2». Если да, то что, если есть два или более статуса 2 записи на имя? Должны ли результаты быть все или только один (за имя)? Если один, то какой? –

ответ

1

Ваш запрос не работает, как вы хотите, потому что вы группируетесь по name и status, так что на самом деле вам нужна последняя запись для каждого name по заказу dateended desc. Вы можете использовать row_number() подход:

with cte as (
    select 
     name, status, dateended, 
     row_number() over(partition by name order by dateended desc) as rn 
    from testcasedata 
    where tid='87946' 
) 
select 
    name, status, dateended 
from cte 
where rn = 1 
+0

спасибо за ответ. Если имя содержит статус 2, оно должно отображать эту строку, хотя это не последняя дата ... иначе, если статус есть что-то другое, кроме 2, тогда он должен отображать статус с максимальной датой ... любая помощь. – sravani

0

Вы можете попробовать это:

select 
    name, 
    (select top 1 status from testcasedata where tid = t.tid order by dateended desc) as status, 
    max(dateended) 
from testcasedata as t 
where tid='87946' 
group by 
    name 
+0

не очень элегантный, что делать, если у вас больше столбцов? Это также не очень хорошая производительность. row_number() гораздо более полезен в SQL Server. –

+0

Вы абсолютно правы, и я дал вам +1 :) Но это еще и оперативное решение, и в случае маленьких столов производительность будет незначительной. – veljasije

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