2013-09-21 58 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