2010-05-21 47 views
4

我有一個表順序(orderid,ordernumber,clientid,orderdesc等),以及order_status表上該順序的相應狀態(statusid,orderid,statusdesc ,statusNote,statustimestamp)postgres - 按多列分組 - 主/明細表類型

說我有一個記錄,以如下

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 

回答

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。在其他地方,如果你還想顯示沒有狀態的訂單,你可以做一個外部連接。