2010-05-21 2 views
4

У меня есть порядок таблицы (orderid, ordernumber, clientid, orderdesc и т. Д.) И соответствующий статус для этого заказа в таблице order_status (statusid, orderid, statusdesc , statusNote, statustimestamp)postgres - группа по нескольким столбцам - таблица типа master/detail

что у меня есть запись того, как показано ниже

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

и соответствующий статус записей

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 

Как я могу получить FOLLO результат крыло (последняя метка времени наряду с несколькими колонками)

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 

Бывший один является более эффективным, если у вас есть много статусов в порядке , последний - несколько статусов на заказ.

Для первого запроса, чтобы работать быстро, создать индекс на status (orderid, statustimestamp)

4

Postgresql дает гораздо более простой альтернативу несколько подзапросов с его (не стандартным SQL) DISTINCT ON:

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; 

Это предполагает что каждый order имеет как минимум один status. В другом месте, и если вы хотите показать также заказы без статуса, вы бы сделали внешнее соединение.

Смежные вопросы