2013-06-24 7 views
1

불행하게도 group byhaving 같은 문장에 관한 나의 지식은 매우 제한적이기 때문에 잘하면 당신이 나를 도울 수 :SQL 서버 : 여러 개의 동일한 키를 사용하여 테이블의 최신 날짜를 얻는 방법을

을 나는보기가 - 여기

ID  | Artikelbezeichnung1     | Bez2  | mesoyear 
_____________________________________________________________________ 
1401MA70 | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi | 1344 
1401MA70 | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi | 1356 
1401MA70 | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi | 1356 
1401MA71 | Marga ,Saracena beige,1S,33,3/33,3 | Marazzi | 1344 
1401MA71 | Marga ,Saracena beige,1S,33,3/33,3 | Marazzi | 1356 
1401MA71 | Marga ,Saracena beige,1S,33,3/33,3 | Marazzi | 1356  
2401CR13 | Crista,Mahon rojo,1S,33,3/33,3  | Cristacer | 1332  
2401CR13 | Crista,Mahon rojo,1S,33,3/33,3  | Cristacer | 1344 

그래서 ID이 고유하지 난 그냥 mesoyear에서 가장 높은 발을 가진 사람이 필요합니다 발췌 - - (우리는 여기에 몇 가지 유럽인이있는 경우는 Winline/MESONIC의 v021입니다).

Select 
    c015 as ID, 
    c003 as Artikelbezeichnung1, 
    c074 as Bez2, 
    mesoyear 
from 
    CWLDATEN_91.dbo.v021 
group by 
    c015 
having 
    mesoyear = max(mesoyear) 

하지만이 ... 전혀 작동하지 않습니다

메시지 8121, 수준 16, 상태 1, 줄 8
열 'CWLDATEN_91 :

내 주먹 솔루션이었다. dbo.v021.mesoyear '는 집계 함수 또는 GROUP BY 절에 포함되어 있지 않으므로 HAVING 절에서 유효하지 않습니다. 이다

에게 메시지 8120, 수준 16, 상태 1, 줄 2
열 'CWLDATEN_91.dbo.v021.c003을'

그래서 난 그냥 having 문을 제거하고이 "더 나은"갔다 집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 유효하지 않습니다.

그래서 "그룹 기준"에 항목을 추가하여 오류를 제거하려고했습니다. 그리고 효과가있었습니다.

Select 
    c015 as ID, 
    c003 as Artikelbezeichnung1, 
    c074 as Bez2, 
    max(mesoyear) 
from 
    CWLDATEN_91.dbo.v021 
group by 
    c015, c003, c074 

내가 원하는 것을 정확하게 제공합니다.

그러나 올바른 선택에는 약 24 개의 열과 일부 계산이 포함됩니다. group by ...에 모든 열을 추가하는 것만으로는 문제를 해결할 수 없습니까?

누군가 적절한 명령을 찾도록 도와 줄 수 있습니까?

감사합니다.

+0

'ROW_NUMBER'를 사용하여 이미 답변을 얻었으므로 T-SQL의 순위 지정 기능에 대한 몇 가지 링크를 추가 할 예정입니다. - http://msdn.microsoft.com/en-us/library/ms189798.aspx & http://msdn.microsoft.com/en-us/library/ms186734.aspx –

+0

또한 'GROUP BY'만 사용하려는 경우 가능합니다. 하위 쿼리에서 결과를 그룹화 한 다음 모든 그룹화 열을 사용하여 원래 테이블로 다시 JOIN 할 수 있습니다. (하지만 row_number를 권하고 싶습니다) –

답변

2

실제로는 group by을 원하지 않습니다. 각 그룹에서 마지막 행을 선택하려고합니다. 당신은 (당신이 SQL 서버 2005 이상을 사용하는 가정) row_number()라는 윈도우 함수와 함께이 작업을 수행 할 수 있습니다

Select v.* 
from (select v.*, 
      ROW_NUMBER() over (partition by c015, c003, c074 order by mesoyear desc) as seqnum 
     from CWLDATEN_91.dbo.v021 
    ) v 
where seqnum = 1; 

Row_number()은 그룹의 행에 일련 번호를 지정합니다. 따라서 c015, c003c074 (partition by 절을 기반으로 함)에 대해 동일한 값을 갖는 모든 행은 그룹에 포함되며 번호가 매겨집니다.주문은 가장 최근의 mesoyear입니다 (order by 조항을 기반으로 함). 따라서 seqnum에있는 1의 값이 최근 연도입니다.

1

당신은 여기가 당신의 키 필드로 그룹화하고, mesoyear에 의해 주문의, ROW_NUMBER() 나중에

SELECT * 
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY c015, c003, c074 ORDER BY mesoyear DESC) RowRank 
     FROM CWLDATEN_91.dbo.v021)sub 
WHERE RowRank = 1 

단지 숫자 행이 지시 어떤 방식으로 ROW_NUMBER() 기능을 SQL Server 2005의 가정 또는으로이 문제를 해결할 수 있습니다.

+0

완벽하게 작동합니다! 감사합니다 !!! – Qohelet