1

我有以下 2 个表:

items:
 id int primary key
 bla text

events:
 id_items int
 num int
 when timestamp without time zone
 ble text
 composite primary key: id_items, num

并希望为每个项目选择最近的事件(最新的“时间”)。我写了一个请求,但我不知道它是否可以更有效地写出来。 同样在 PostgreSQL 上,比较 ​​Timestamp 对象存在问题: 2010-05-08T10:00:00.123 == 2010-05-08T10:00:00.321 所以我选择 'MAX(num)' 有什么想法可以让它变得更好吗?谢谢。

SELECT i.*, ea.* FROM items AS i JOIN
( SELECT t.s AS t_s, t.c AS t_c, max(e.num) AS o FROM events AS e JOIN
( SELECT DISTINCT id_item AS s, MAX(when) AS c FROM events GROUP BY s ORDER BY c ) AS t
ON t.s = e.id_item AND e.when = t.c GROUP BY t.s, t.c ) AS tt
ON tt.t_s = i.id JOIN events AS ea ON ea.id_item = tt.t_s AND ea.cas = tt.t_c AND ea.num = tt.o;

编辑:有错误的数据,对不起,我的错误,但是感谢您找到更好的 SQL 查询

4

3 回答 3

0
SELECT  (i).*, (e).*
FROM    (
        SELECT  i,
                (
                SELECT  e
                FROM    events e
                WHERE   e.id_items = i.id
                ORDER BY
                        when DESC
                LIMIT 1
                ) e
        FROM    items i
        ) q
于 2010-05-11T09:27:52.630 回答
0

如果您使用的是 8.4:

select * from (
  select item.*, event.*,
         row_number() over(partition by item.id order by event."when" desc) as row_number
  from items item
       join events event on event.id_items = item.id
) x where row_number = 1
于 2010-05-11T09:58:11.353 回答
0

对于这种连接,我更喜欢DISTINCT ON语法(示例)。这是一个 Postgresql 扩展(不是 SQL 标准语法),但它非常方便:

SELECT DISTINCT ON (it.id) 
it.*, ev.*
FROM items it, events ev
WHERE ev.id_items = it.id
ORDER by it.id, ev.when DESC;

就简单性和可读性而言,您无法击败它。

该查询假定每个项目至少有一个事件。如果没有,并且如果您想要所有事件,则需要外部连接:

SELECT DISTINCT ON (it.id) 
it.*, ev.*
FROM items it LEFT JOIN events ev
ON ev.id_items = it.id
ORDER BY it.id, ev.when DESC;

顺便说一句:Postgresql 中没有“时间戳问题”,也许您应该更改标题。

于 2010-05-11T12:13:16.357 回答