postgres - группировка по нескольким столбцам - таблица типа master / detail - PullRequest
4 голосов
/ 21 мая 2010

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

скажем, у меня есть запись в порядке, как показано ниже

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

Как получить следующий результат (последняя отметка времени вместе с несколькими столбцами)

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

Ответы [ 2 ]

5 голосов
/ 22 мая 2010

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. В другом месте, и если вы хотите показывать также заказы без статуса, вы должны выполнить внешнее объединение.

0 голосов
/ 21 мая 2010

Это:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...