2010-05-21 3 views
4

order_status 테이블 (statusid, orderid, statusdesc)에서 해당 주문에 대한 테이블 주문 (orderid, ordernumber, clientid, orderdesc 등) 및 해당 상태가 있습니다. , statusNote, statustimestamp) postgres - 여러 열을 기준으로 그룹화 - 마스터/상세 유형 테이블

내가

orderid  orderumber  clientid orderdesc 
1111  00980065  ABC   blah..blah.. 

및 해당 상태 항목이 아래와 같은 순서로 기록이 있다고 나는 FOLLO을 얻을 수있는 방법

statusid orderid  statusdesc statusNote statustimestamp 
11   1111   recvd   status blah yyyy-mm-dd:10:00 
12   1111   clientproce status blah yyyy-mm-dd:11:00 
13   1111   clientnotice status blah yyyy-mm-dd:15:00 
14   1111   notified  status blah yyyy-mm-dd:17:00 

날개 결과 (다중 컬럼과 함께 최신 타임 스탬프)

1111 14 00980065 ABC blah..blah.. notified status blah yyyy-mm-dd:17:00 

답변

0

이 :

SELECT (o).*, (s).* 
FROM (
     SELECT o, 
       (
       SELECT s 
       FROM status s 
       WHERE s.orderid = o.orderid 
       ORDER BY 
         statustimestamp DESC 
       LIMIT 1 
       ) s 
     FROM orderid o 
     ) q 

나이 :

SELECT DISTINCT ON (o.orderid) * 
FROM orders o 
LEFT JOIN 
     status s 
ON  s.orderid = o.orderid 
ORDER BY 
     o.orderid, s.statustimestamp DESC 

당신이 주문 당 상태가 많이있는 경우 전자 하나가 더 효율적입니다 주문 당 상태가 거의없는 경우 후자입니다.

SELECT 
DISTINCT ON (o.orderid) 
o.orderid, s.statusid, o.clientid, o.orderdesc, 
s.statusdesc, s.statusnote, s.statustimestamp 
FROM order o, status s 
WHERE s.orderid = o.orderid 
ORDER BY o.orderid, s.statustimestamp DESC; 

이것은 가정 : 첫 번째 쿼리는, 빠른 작동 status (orderid, statustimestamp)

4

PostgreSQL을에 인덱스를 생성하기 위해

당신이 그 (하지 표준 SQL)와 다수의 부속 선택에 훨씬 간단한 대안 DISTINCT ON을 제공합니다 모든 order에는 적어도 하나의 status이 있어야합니다. 다른 곳에서도 주문없이 상태를 표시하고 싶다면 외부 조인을해야합니다.

관련 문제