0

I have the below query -

 select w1.System_Id, w1.TeamProjectSK, w1.System_State, w1.System_Rev 
 from dbo.DimWorkItem w1
  where w1.System_Id = 29259
  order by w1.TeamProjectSK asc, w1.System_Rev desc

The output looks like -

System_Id    TeamProjectSK  System_State    System_Rev
29259    4            Closed              6
29259    4            Resolved            5
29259    4            Active              4
29259    4            Active              3
29259    4            Active              2
29259    4            Proposed            1

Now, i need my output to look like -

System_Id    TeamProjectSK  System_State    System_Rev
29259    4            Closed              6
29259    4            Resolved            5
29259    4            Active              4
29259    4            Proposed            1

That is, I want to have the highest value in the "System_Rev" column grouped by "System_State". I tried the below query -

 select w1.System_Id, w1.TeamProjectSK, w1.System_State, w1.System_Rev 
 from dbo.DimWorkItem w1
 inner join 
 (
    select System_State, max(System_Rev) as m 
    from dbo.DimWorkItem group by System_State
 ) w
 on w1.System_State = w.System_State and w1.System_Rev = w.m
 order by w1.System_Id asc, w1.TeamProjectSK asc

But it didn't work to my benefit. Please help.

Regards.

4

2 回答 2

8

由于您使用的是 SQL Server row_number(),因此如果您有 sql server 2005+,则可以使用:

select System_Id, TeamProjectSK, System_State, System_Rev
from
(
    select w1.System_Id, w1.TeamProjectSK, w1.System_State, 
      w1.System_Rev, row_number() over (
        partition by w1.System_Id, w1.TeamProjectSK, w1.System_State 
        order by w1.System_Rev desc) rn
    from dbo.DimWorkItem w1
    where w1.System_Id = 29259
) d
where rn = 1
order by System_Id, TeamProjectSK desc;

请参阅SQL Fiddle with Demo

如果要使用max()聚合函数,则可以使用子查询:

select d1.system_id, 
  d1.teamprojectsk, 
  d1.system_state,
  d1.system_rev
from DimWorkItem d1
inner join
(
  select max(system_rev) system_rev,
    system_id, 
    teamprojectsk,
    system_state
  from DimWorkItem
  group by system_id, teamprojectsk, system_state
) d2
  on d1.system_id = d2.system_id
  and d1.teamprojectsk = d2.teamprojectsk
  and d1.system_state = d2.system_state
  and d1.system_rev = d2.system_rev

请参阅带有演示的 SQL Fiddle

于 2013-06-04T21:14:49.950 回答
0

我可以建议:

 select w1.System_Id, w1.TeamProjectSK, w1.System_State, 
   max(w1.System_Rev) as System_Rev 
 from dbo.DimWorkItem w1
      where w1.System_Id = 29259
    group by w1.System_Id, w1.TeamProjectSK, w1.System_State
    having max(w1.System_Rev)>0
      order by w1.TeamProjectSK asc, System_Rev desc

我尝试了一个具有相同场景的示例。一个团体和一个拥有会有所帮助。

CREATE TABLE TEST_X(FIELD1 VARCHAR (100), FIELD2 INTEGER);

INSERT INTO TEST_X VALUES 
('s1','100'),('S2','1000'),('S2','220'),('S3','20');


SELECT FIELD1, MAX(FIELD2) FROM TEST_X 
GROUP BY FIELD1 
HAVING MAX(FIELD2)>1

我这里有。 http://sqlfiddle.com/#!3/e5b02/3

谁说这行不通?http://sqlfiddle.com/#!3/53c5e/7

于 2013-06-04T21:22:50.093 回答