2016-11-01 5 views
0

SQL Server에서이를 파악할 수 없습니다.SQL Server에서 집계 된 최대 행 찾기

두 테이블 :

상태 :

id proj status changedate 
------------------------------- 
1 1  1  2015-01-01 
2 1  3  2016-01-01 
3 1  2  2016-05-01 
4 2  1  2016-01-01 
... etc 

프로젝트 :

id title  active 
---------------------------- 
1  My project 1 
2  No more  0 

이 지금은 가장 최근의 상태 ID로 모든 활성 프로젝트를 나열합니다. 다양한 종류의 쿼리를 시도했지만 오류가 발생합니다.

는 HAVING 다른 솔루션 포함 중이 시도했지만 운 :

SELECT projects.id, projects.title, statuses.status 
FROM projects 
INNER JOIN statuses ON statuses.proj = projects.id 
WHERE projects.active = 1 
    AND statuses.changedate = MAX(statuses.changedate)  

거기에 모든 SQL 서버 마법사?

SELECT p.id, p.title, s.status 
FROM projects p INNER JOIN 
    statuses s 
    ON s.proj = p.id 
WHERE p.active = 1 AND 
     s.changedate = (SELECT MAX(s2.changedate) 
         FROM statuses s2 
         WHERE s2.proj = p.id 
        ); 

보다 일반적인 솔루션은 ROW_NUMBER() 사용 :

SELECT p.id, p.title, s.status 
FROM projects p INNER JOIN 
    (SELECT s.*, 
      ROW_NUMBER() OVER (PARTITION BY s.proj ORDER BY s.changedate DESC) as seqnum 
     FROM statuses s 
    ) s 
    ON s.proj = p.id AND seqnum = 1 
WHERE p.active = 1; 

그리고 더 헤아릴 수없는 방법 APPLY 사용

SELECT p.*, s.status 
FROM projects p OUTER APPLY 
    (SELECT TOP 1 s.* 
     FROM status s 
     WHERE s.proj = p.id 
     ORDER BY s.changedate DESC 
    ) s 
WHERE p.active = 1; 
당신이있는 경로로

답변

4

, 당신은 하위 쿼리가 필요합니다

글쎄, 이것은 결코 보지 못했던 것입니다.전에.

select top 1 WITH TIES 
t1.status 
, t1.changedate 
, p.title 
from statuses t1 
inner join projects p on p.id = t1.proj AND p.active = 1 
order by 
ROW_NUMBER() OVER(PARTITION BY t1.proj ORDER BY changedate desc) 
+0

감사합니다. 전에 서브 쿼리 방법을 시도했지만 결코 알아 내지 못했습니다. :) – jtheman

1

또 다른 옵션은 ROW_NUMBER()를 사용하여 TIES 및 주문 TOP 1을 사용하는 것입니다 이렇게 :

+ ------------- + ----------------------- + 
| title   | max(s.change_date)  | 
+ ------------- + ----------------------- + 
| My project | 2015-01-01    | 
| Other project |       | 
+ ------------- + ----------------------- + 
2 rows 
1

이 MySQL의에서하지만 구문 SQLSERVER

create table status (
    id int, 
    proj int, 
    status int, 
    change_date date 
); 

create table project (
    id int, 
    title varchar(64), 
    active int 
); 

insert into status values (1,1,1,'2015-01-01'); 
insert into status values (2,1,3,'2015-01-01'); 
insert into status values (3,1,2,'2015-01-01'); 
insert into status values (4,2,1,'2015-01-01'); 

insert into project values (1,'My project', 1); 
insert into project values (2,'No more', 0); 
insert into project values (3,'Other project', 1); 


select 
    p.title, 
    max(s.change_date) 
from 
    project p 
    left outer join status s on s.proj = p.id 
where 
    p.active = 1 
group by 
    p.title 
; 

출력 외모에 대한 매우 비슷해야합니다