2014-10-24 2 views
0

에서 가장 최근의 레코드를 가져옵니다. 주문 번호, 주문 설명 및 주문 날짜를 보여주는 테이블이 있습니다.그룹화 기준을 사용하여 테이블

주문 번호가 반복되는 경우가 있습니다.

orderID  orderInfo  dateAdded 
1   cheese&tomato 2014-10-03 
2   bacon   2014-10-05 
3   tuna   2014-09-30 

을 나는 시도했다 :

select orderID, orderInfo from orders group by orderID 
나는 그래서 내 쿼리가 반환해야합니다 설명으로 모든 고유 주문 번호를 얻을 수 있지만 중복
orderID  orderInfo  dateAdded 
1   cheese   2014-10-01 
1   cheese+   2014-10-02 
1   cheese&tomato 2014-10-03 
2   bacon   2014-10-05 
2   bacon   2014-10-04 
2   bacon   2014-10-02 
3   tuna   2014-09-30 

의 경우에 가장 최근에 보여주고 싶은

그러나 이것은 각 orderID의 첫 번째를 제공합니다. 가장 최근의 것을 선택하려면 어떻게해야합니까?

답변

2

당신 수 간단한 LEFT JOIN 자체 테이블 on orderID은 조인 조건 인 t1.dateAdded < t2.dateAdded을 추가합니다.

마지막으로 t2.dateAdded이 Null이며 주문 당 최신 항목이있는 결과를 선택합니다. 는

SELECT 
    * 
FROM 
    test t1 
LEFT JOIN 
    test t2 
ON 
    t1.id = t2.id AND 
    t1.dateAdded < t2.dateAdded 
WHERE 
    ISNULL (t2.dateAdded); 

http://sqlfiddle.com/#!2/0629b2/1

그러나 거대한 테이블이이 가입 할 수 있음을 인식 (다음 있기 때문에, 당신은 t1 현재이 결과는 참여 그룹 내부의 최신 날짜입니다) ! 무대 뒤에서

봐 : 당신이 볼 수 있듯이 http://sqlfiddle.com/#!2/0629b2/3

, 당신은 가 null t2_dateAdded 행을해야합니다. 그러나 여러분도 볼 수 있듯이 결과는 이미 테이블에 비해 더 큽니다. 따라서이 예제에서는 6 개의 추가 조인 결과를 만들었습니다. 나중에이를 버리십시오. (내가 생각한 100.000 개의 항목까지 테이블에는 아무런 문제가 없습니다. 여전히 500.000 개의 행이있는 서버에서 실행하고 쿼리는 ~ 2 초 내에 실행됩니다.)

+0

네,이게 작동한다고 생각합니다. 지금 테스트하고 있습니다. 고맙습니다 :-) – Chris

0

시도 MAX를 사용하여 당신이 말했듯이

SELECT orderID,orderInfo,MAX(dateAdded) from (
    SELECT orderID,orderInfo,dateAdded from orders ORDER BY dateAdded DESC) as t 
    group by orderID 
+0

그게 나에게 가장 최근의 주문 날짜를 알려주지 만 ... 주문에 대한 올바른 orderInfo를 표시하지 않습니다. 그것은 가장 최근의 주문의 날짜와 첫 번째의 orderInfo가 결합 된 것 같습니다. – Chris

+0

내 게시물을 업데이트했습니다. 나는이 시간이 올바른 결과를 가져올 것이라고 생각한다. – geoandri

-1

, 당신은 가장 최근의 원하는() 함수를 사용할 수 있도록 :

select * from orders group by orderID order by dateAdded desc 
+1

이것은 작동하지 않을 것이다. 이것은 첫 번째 주문의 날짜를 제공 한 다음 이들을 기준으로 정렬합니다. 그것은 나에게 가장 최근의 날짜를주지 않는다 – Chris

+0

당신은 그것을 사용하려고 시도 했습니까? 귀하의 질문에 방금 당신이 가장 최근의 것을 원한다고 말했고, 최근의 것을 정의하기 위해서는 주문이 아니라 날짜별로 표시되어야합니다. – TioDavid

+0

나는 똑같은 말을하고 시험해 보았다. 실제로는 효과가 없다. 이 anwser를 삭제할 수 있습니다. – KyleK

관련 문제