【问题标题】:Get last entry from each user in database从数据库中的每个用户获取最后一个条目
【发布时间】:2016-11-17 19:32:50
【问题描述】:

我有一个 Postgresql 数据库,但我无法正确查询,尽管这似乎是一个常见问题。

我的桌子是这样的:

CREATE TABLE orders (
   account_id   INTEGER,
   order_id     INTEGER,
   ts           TIMESTAMP DEFAULT NOW()
)

每次有新订单,我都会用它来链接account_idorder_id

现在我的问题是我想获得一个列表,其中包含每个帐户的最后一个订单(通过查看 ts)。

例如,如果我的数据是:

account_id    order_id            ts
         5         178        July 1
         5         129        July 6
         4         190        July 1
         4         181        July 9
         3         348        July 1
         3         578        July 4
         3         198        July 1
         3         270       July 12

然后我希望查询只返回每个帐户的最后一行:

account_id    order_id            ts
         5         129        July 6
         4         181        July 9
         3         270       July 12

我已经尝试过GROUP BY account_id,我可以使用它来获取每个帐户的MAX(ts),但是我无法获取关联的order_id。我也尝试过子查询,但我似乎无法正确处理。

谢谢!

【问题讨论】:

  • 您必须有一些主键,因此请使用“LIMIT 1”和“ORDER BY id DESC”。它颠倒顺序并将其限制为 1(因此最高 id 是第一个结果,limit 然后只取这 1 个结果)。
  • @Rajat 我不想要一行,我想要每个 account_id 一行。
  • @Janis 谢谢,但答案是加入两个表。我只有一张桌子。另外,我正在使用 Postgresql。

标签: sql postgresql greatest-n-per-group


【解决方案1】:
select distinct on (account_id) *
from orders
order by account_id, ts desc

https://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT:

SELECT DISTINCT ON ( expression [, ...] ) 只保留给定表达式计算结果为相等的每组行的第一行。 DISTINCT ON 表达式使用与 ORDER BY 相同的规则进行解释(见上文)。请注意,除非使用 ORDER BY 确保所需的行首先出现,否则每组的“第一行”是不可预测的。

【讨论】:

  • 太棒了!效果很好!谢谢!我以前什至用过 DISTINCT,但不知道 ON 关键字。
  • 请注意:显然DISTINCT ON (expression) 是 Postgresql 的东西。这不是标准的 SQL。不过仍然是最好的答案,因为我使用的是 Postgresql。
【解决方案2】:

row_number() 窗口函数可以提供帮助:

select account_id, order_id, ts
  from (select account_id, order_id, ts,
               row_number() over(partition by account_id order by ts desc) as rn
          from tbl) t
 where rn = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2014-09-11
    • 2021-09-28
    • 2021-12-09
    • 1970-01-01
    • 2018-10-01
    • 2016-02-04
    相关资源
    最近更新 更多