假设您有两个表:
订单
order_id , ....
1, ...
2, ...
每个订单都有一个“状态历史”。这存储在历史表中:
serial, date, order_id , order_state
10, 2012-01-01, 1, 'INIT'
11, 2012-01-02, 2, 'INIT'
12, 2012-02-03, 1, 'COMPLETED'
13, 2012-02-04, 1, 'DISPATCHED'
14, 2012-02-05, 2, 'COMPLETED'
15, 2012-02-06, 2, 'DISPATCHED'
现在我想知道过去任何时候我所有订单的状态。例如,我想知道 2012-02-05 的订单状态:
order_id, order_state, state_date
1 , 'DISPATCHED' , 2012-02-04
2, 'COMPLETED' , 2012-02-05
(state_date 列是可选的)。
有没有一种方法可以编写一个查询,该查询比遍历订单并在应用程序代码中获取其“在给定日期的状态”更有效?
我已经用 Postgresql 中的 rank() WINDOW 函数做到了这一点,但我对它必须获取所有历史记录(在给定日期之前)只是为了选择排名 1 的事实并不满意。在我看来这并不比在应用程序代码中做的更好。
SELECT * FROM ( SELECT o.order_id,
h.order_state,
h.state_date,
rank() ON (PARTITION BY order_id ORDER BY h.serial DESC)
AS hrank
FROM order o, history h
WHERE
h.order_id = o.order_id AND
h.date < given_date
) AS rh
WHERE
rh.hrank = 1;
我真正想要的是我的分区定义中的某种 LIMIT 1,但我不知道这是否可能。