2013-06-04 3 views
0

У меня есть ниже запрос -Пробовал выборки самый высокий ряд ... SQL Server

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 

Результат выглядит -

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 

Теперь я нужен мой выход выглядеть -

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

То есть, я хочу иметь наибольшее значение в столбце «System_Rev», сгруппированном по «System_State». Я попробовал следующий запрос:

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 

Но это не помогло мне. Пожалуйста помоги.

С уважением.

ответ

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

+3

@ Rajaganesh Я не сделал ни слова, но ваше предыдущее решение не работало сначала, и пример был о другой таблице и ситуации, которые объясняли по этому вопросу – Lamak

8

Поскольку вы используете SQL Server можно использовать row_number(), если у вас есть сервер SQL 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 with Demo

+0

* вздох * Я собирался опубликовать этот ответ, но, увы, вы были быстрее. +1, хотя я бы сказал, что это справедливо для SQL Server 2005+ – Lamak

+0

@a_horse_with_no_name yup, вот-вот исправит мое заявление – Lamak

+0

@ Lamak done, добавлено примечание. :) – Taryn