2010-05-21 7 views
4

J'ai un ordre de table (orderid, ordernumber, clientid, orderdesc etc.,) et un statut correspondant pour cet ordre sur une table order_status (statusid, orderid, statusdesc , StatusNote, statustimestamp)postgres - groupe par sur plusieurs colonnes - table type/détail

que j'ai un dossier afin que ci-dessous

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

et entrées d'état correspondant

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 

Comment puis-je obtenir le Follo résultat de l'aile (dernière horodatage avec plusieurs colonnes)

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

Répondre

0

Ce:

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 

ou ceci:

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

L'ancien est plus efficace si vous avez beaucoup de statuts par ordre , le dernier si peu de statuts par commande.

Pour la première requête de travailler rapidement, créez un index sur status (orderid, statustimestamp)

4

Postgresql vous donne une beaucoup plus simple alternative aux multiples sous-requêtes avec son (non SQL standard) 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; 

Cela suppose que chaque order a au moins un status. Ailleurs, et si vous voulez montrer aussi des commandes sans statut, vous ferez une jointure externe.

Questions connexes