2014-07-16 5 views
0

라고 말합니다. 특정 날짜에 가격이 설정된 항목이 포함 된 Item이라는 테이블이 있다고 해봅시다.그룹 단위로 최대 열을 포함하는 행을 선택하십시오.

항목 이제

id | date  | price 
---+------------+------ 
1 | 2014-01-01 | 1.09 
1 | 2014-03-15 | 1.19 
2 | 2014-04-02 | 2.75 
1 | 2014-07-28 | 0.99 
2 | 2014-08-07 | 2.35 
3 | 2014-10-21 | 3.90 

내가 (각 항목에 대한 마지막 레코드) 항목 당 현재 가격 선택 싶습니다

WITH lastChange AS (
    SELECT id, MAX(date) date 
    FROM Item 
    GROUP BY id 
) 

SELECT Item.id, Item.price 
FROM Item 
JOIN lastChange ON Item.id = lastChange.id AND Item.date = lastChange.date 

주기 :

id | price 
---+------ 
1 | 0.99 
2 | 2.35 
3 | 3.90 

을 이 선택을하는 더 좋은 방법이 있는지 궁금하네요.

+0

을 적용 당신이 동일한 ID와 날짜하지만 서로 다른 가격으로 두 개의 행이 있다면? – Anon

+0

그런 일이 일어나지 않는다고 가정 해 봅시다. 이것은 단순화 된 예입니다. 나는 밀리 세컨드 (milliseconds)를 포함하여 시간을 더할 수는 있지만 그것은 그것이 내가 추측하는 질문을 더 분명하게하지는 않는다. – Aquillo

+0

기본적인 질문은 "그룹 별 최대 열 수를 포함하는 전체 행을 어떻게 선택합니까?"라는 것이 분명합니다. 한 그룹에서 최신 가격 이상의 여러 상황을 처리하는 방법에 대해 신중히 생각하십시오. 테이블에 UNIQUE 제약 조건을 사용하십시오. – Anon

답변

1

윈도 윙 기능

WITH t AS (
    SELECT * 
    ,MAX(date) OVER(PARTITION BY id) max_date_by_id 
    FROM Item 
) 
SELECT * 
FROM t 
WHERE date = max_date_by_id 

크로스

SELECT * 
FROM Item t 
CROSS APPLY (
    SELECT MAX(date) max_date_by_id 
    FROM Item 
    WHERE id = t.id 
) 
WHERE date = max_date_by_id 
+0

내 솔루션과 교차 적용에 대해 윈도우 기능을 선호합니다. http://sqlfiddle.com/#!6/a8d4c/1/0처럼 쿼리가 더욱 복잡해지면 더 많은 옵션을 제공하므로 – Aquillo

관련 문제