2010-05-21 20 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。在其他地方,如果你还想显示没有状态的订单,你可以做一个外部连接。