我有一个表顺序(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
答案 0 :(得分:5)
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
。在其他地方,如果你想显示没有状态的订单,你也可以进行外连接。
答案 1 :(得分: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)