2013-09-21 57 views
-1

我試圖寫一個SELECT語句檢索姓名和身份的行只是爲了與最近dateended特定的TIDSQL:GROUP BY與集合函數條款

表模式看起來像

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 

在這裏,我實際上應該只顯示不同的名稱和狀態,其中如果一個名稱的狀態含有二是應只顯示該行,否則它應該由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

您的查詢不工作,只要你想,因爲您正在分組namestatus,所以實際上您需要最後一個記錄,每個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