2011-10-19 3 views
0

나는 이와 같은 데이터를 가지고 있습니다.
customer가입했지만 최신 날짜로 한 번만 가져 오기

| customerId | fullName  | sex 
| 1   | Budi Arsana | Male 
| 2   | Peter Parker | Male 

과 다른 테이블 이름 transaction

| Id | bookingDate | customer 
| 1 | 2011-09-01 | 1 
| 2 | 2011-09-30 | 1 
| 3 | 2011-09-01 | 2 

그리고 내가 트랜잭션이있는 고객을 선택 2 표는 다음 최신 날짜 만 1 거래를 얻을 결합하여 결과를 얻을합니다 . 자체 배제를 사용하여이

| customerId | fullName  | sex | transId | bookingDate 
| 1   | Budi Arsana | Male | 2  | 2011-09-30 
| 2   | Peter Parker | Male | 3  | 2011-09-01 

답변

5
SELECT c.customerId, c.fullName, c.sex, t.Id AS transId, t.bookingDate 
    FROM customer c 
     INNER JOIN (SELECT customer, MAX(bookingDate) AS MaxDate 
         FROM transaction 
         GROUP BY customer) q 
      ON c.customerId = q.customer 
     INNER JOIN transaction t 
      ON q.customer = t.customer 
       AND q.MaxDate = t.bookingDate; 
+0

2 라인의 평균은 무엇입니까? 'FROM customer C','FROM customer AS C'를 원하셨습니까? – GusDeCooL

+0

@GusDeCooL 'AS'는 선택 사항이므로 두 버전 모두 동일한 의미입니다. –

+2

네, 짧은 형식입니다, 'AS'는 생략 할 수 있습니다. 최소한 열의 별칭에 사용될 때는 권장하지 않습니다. 쉼표를 넣는 것은 쉽지만 디버깅 할 때 놓친 것을 쉽게 발견 할 수는 없습니다. 나는. 'SELECT id group, name FROM users'는 찾기가 까다로울 수 있습니다. 퍼팅과'AS'는 단지 몇 번의 키 입력만으로도 쉽게 읽을 수 있습니다. – Nikoloff

2

처럼 가입 :

SELECT c.customerId, c.fullName, c.sex, t.Id AS transId, t.bookingDate 
    FROM customer c 
     LEFT JOIN transaction t ON t.customer = c.customerId 
     LEFT JOIN transaction t2 ON t2.customer = t.customer 
    AND t2.bookingDate > t.bookingDate 
WHERE t2.Id IS NULL; 

원리는 다른를 만들 transaction 테이블 (t2)의 작업 복사본에 가입하고 제거하기 위해 그것을 사용하는 것입니다 최종 결과 집합에서 가장 최근의 레코드를 제외하고 모두 transaction (t)입니다.

경고 : 고객 당 하루에 여러 번 예약 할 경우 작동하지 않습니다. 이 경우 날짜에서 시간 소인으로 변경할 수 있습니다.

+1

+1 두 번째 LEFT JOIN에서 '트랜잭션 t t2'에서 여분의 't'를 제거하면 아름답게 작동합니다. http://sqlize.com/MpaCjlZb67 – mellamokb

+0

아, 감사합니다. 너 @ 멜라. 편집 됨. 그리고 sqlize에 대한 팁을 주셔서 감사합니다. 전에는 보지 못했습니다. – bernie

관련 문제