代码之家  ›  专栏  ›  技术社区  ›  William Falcon

为postgres中的每个用户选择项目的最后一个

  •  0
  • William Falcon  · 技术社区  · 7 年前

    我想获取每个用户的最后一个条目,但customer_id是散列“ASAG#…”,按customer_id排序会破坏查询。有其他选择吗?

    Select Distinct On (l.customer_id)
         l.customer_id
        ,l.created_at
        ,l.text
    From likes l
    Order By l.customer_id, l.created_at Desc
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Tim Biegeleisen    7 年前

    您当前的查询似乎已经在运行,q.v.这里:

    Demo

    我不知道为什么您当前的查询没有生成您预期的结果。它应该为每个客户返回一个不同的记录,对应于最近的一个记录,考虑到您的 ORDER BY 陈述

    在任何情况下,如果它不能满足您的需要,另一种选择是使用 ROW_NUMBER() 1 转到每个用户的最新记录。然后外部查询只保留最新的记录。

    SELECT
        t.customer_id,
        t.created_at,
        t.text
    FROM
    (
        SELECT *,
            ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) rn
        FROM likes
    ) t
    WHERE t.rn = 1
    

    加快使用 您可以尝试在 customer_id created_at

    CREATE INDEX yourIdx ON likes (customer_id, created_at);