2013-07-02 3 views
0

각 고유 한 Part_Number에 대한 가장 최근의 Quote_Date에 대해서만 Quote.Quote를 반환하도록 다음 쿼리를 수정하려면 어떻게해야합니까? 견적 고유하므로 첫 번째 레코드를 반환 할 수 없습니다. 나는 이것이 거의 같은 방식으로 여러 번 요청되었다는 것을 알고 있지만 row_number, rank, partition, 파생 테이블 등을 사용하여 올바르게 얻을 수는 없습니다. 어떤 도움을 주셔서 감사합니다.SQL : 고유 한 부분에 대한 가장 최근 날짜의 ID 반환

Sample 
    Quote  Part_Number  Quote_Date 
    1    a    1/1/12 
    2    a    1/2/12 
    3    a    1/3/12 
    4    b    1/2/12 
    5    b    1/3/12 
    6    c    1/1/12 

    Desired Results 
    Quote  Part_Number  Quote_Date 
    3    a    1/3/12 
    5    b    1/3/12 
    6    c    1/1/12 

    SELECT Quote.Quote, Quote.Part_Number, MAX(RFQ.Quote_Date) AS Most_Recent_Date 
    FROM Quote INNER JOIN RFQ ON Quote.RFQ = RFQ.RFQ 
    GROUP BY Quote.Part_Number, Quote.Quote 
    HAVING (NOT (Quote.Part_Number IS NULL)) 

답변

2

이 쿼리 때문에 partition...order by quote_date desc 절에, '1'로 최대 날짜 번호를합니다.

select Quote, Part_number, Quote_date, 
     rank() over (partition by part_number 
        order by quote_date desc) as date_order 
from sample 

이 경우 일반적으로 rank() 함수가 row_number()보다 더 좋습니다. 부품 번호에 대해 동일한 최대 날짜가있는 두 개의 행이있는 경우 rank()는 둘 다 동일하게 지정합니다. 어떻게 작동하는지 보려면 insert into your_table values (7, 'a', '2012-01-03'), rank()를 사용하여 쿼리를 실행하십시오. row_number()로 변경하십시오. 차이점을 보시겠습니까?

중에서 선택하십시오. WHERE 절은입니다.

select Quote, Part_number, Quote_date 
from 
    (select Quote, Part_number, Quote_date, 
      rank() over (partition by part_number 
         order by quote_date desc) as date_order 
    from sample) t1 
where date_order = 1; 

다른 접근법은 부품 번호 세트와 관련된 최대 날짜를 먼저 유도하는 것입니다.

select Part_Number, max(Quote_Date) as max_quote_date 
from sample 
group by Part_number; 

그런 다음 원래 테이블과 조인하여 필요한 다른 열을 선택하십시오.

select s.Quote, s.Part_Number, s.Quote_Date 
from sample s 
inner join (select Part_Number, max(Quote_Date) max_quote_date 
      from sample 
      group by Part_number) t1 
     on s.Part_Number = t1.Part_number 
     and s.Quote_Date = t1.max_quote_date 
order by Part_Number; 
+0

나는 날짜에 가입하는 것을 피할 수있는 모든 것을 해드립니다 .... – Ellesedil

+0

Thank You! 옵션 1은 내가 필요로하고 훌륭하게 작동 한 것입니다! – user2543368

0

사진을주세요. Part_Number where 절이 필요한지 잘 모르겠지만 원래 SQL (HAVING 절)에 포함하여 보관했습니다. 분명히 데이터가 어떻게 보이는지는 분명하지 않지만 중요한 것은 나머지 하위 선택입니다.

SELECT a.Quote, a.Part_Number, a.Quote_Date 
FROM 
    (SELECT ROW_NUMBER() OVER(PARTITION BY q.Part_Number ORDER BY r.Quote_Date DESC) AS RowNum, 
    q.Quote, q.Part_Number, r.Quote_Date 
    FROM Quote q INNER JOIN RFQ r ON q.RFQ = r.RFQ 
    WHERE q.Part_Number IS NOT NULL) a 
WHERE a.RowNum = 1; 
0

CTE를 사용하면 쉽게 읽고 쉽게 읽을 수 있습니다.

;with cte as (
    select 
     *, 
     row_number() over (partition by Part_Number order by Quote_Date desc) rownum 
    from 
     @quote 
) 
select Quote, Part_Number, Quote_Date from cte where rownum = 1