在 postgres 查询中获取第一行

Posted

技术标签:

【中文标题】在 postgres 查询中获取第一行【英文标题】:getting first row in postgres query 【发布时间】:2018-01-29 07:38:02 【问题描述】:

我正在使用内部联接从 2 个表中查询一些数据。

这里是查询,

test_db=> select api_booking.install_ts, api_user.id from api_booking inner join api_user on api_booking.user_id=api_user.id and api_booking.status='completed' limit 20 ; 
          install_ts           | id 
-------------------------------+----
 2016-09-15 09:53:42.511367+00 |  9
 2016-10-12 11:37:11.438715+00 |  9
 2016-10-21 08:55:49.57813+00  |  9
 2017-02-27 06:12:17.362996+00 |  9
 2017-02-27 06:24:59.316051+00 |  9
 2017-02-28 06:15:35.00841+00  |  9
 2017-02-28 06:34:57.766365+00 |  9
 2017-05-23 14:40:54.831525+00 | 14
 2017-06-05 07:47:39.78306+00  | 17
 2017-06-05 07:55:30.171103+00 | 17
 2016-12-06 06:47:43.860581+00 | 19
 2016-09-09 07:34:58.40589+00  | 20
 2016-11-16 09:09:24.466439+00 | 24
 2016-10-03 02:52:24.419793+00 | 24
 2017-05-02 03:48:02.843209+00 | 24
 2017-05-08 10:01:45.77093+00  | 24
 2016-09-09 12:08:27.503695+00 | 27
 2016-09-10 10:05:44.617737+00 | 27
 2016-09-11 10:08:22.791411+00 | 27
 2016-09-12 08:56:31.462979+00 | 27
(20 rows)

现在,我只想要每个 user_id 的第一行。

这样,

          install_ts           | id 
-------------------------------+----
 2016-09-15 09:53:42.511367+00 |  9
 2017-05-23 14:40:54.831525+00 | 14
 2017-06-05 07:47:39.78306+00  | 17
 2016-12-06 06:47:43.860581+00 | 19
 2016-09-09 07:34:58.40589+00  | 20
 2016-11-16 09:09:24.466439+00 | 24
 2016-09-09 12:08:27.503695+00 | 27

我应该使用什么查询?

【问题讨论】:

select distinct on (api_user.id) api_user.id,api_booking.install_ts from api_booking inner join api_user on api_booking.user_id=api_user.id and api_booking.status='completed' limit 20 ; smth like? 工作@VaoTsun 谢谢。 【参考方案1】:

为什么不使用简单的GROUP BY

select 
  min(api_booking.install_ts) as install_ts, 
  api_user.id 
from api_booking 
  inner join api_user on api_booking.user_id=api_user.id and api_booking.status='completed' 
group by api_user.id
limit 20 ; 

【讨论】:

【参考方案2】:

这应该可以解决问题:

select distinct on (api_user.id) api_user.id,api_booking.install_ts 
from api_booking inner 
join api_user on api_booking.user_id=api_user.id 
and api_booking.status='completed' 
order by api_user.id,api_booking.install_ts
limit 20 ;

【讨论】:

ordery by api_booking.install_ts,对不起,默认顺序是什么?降序/升序? 即使我们不使用 order by,它仍然返回相同的结果。真的有必要用吗? order by 保证订单。否则“第一”行有时不是“第一”

以上是关于在 postgres 查询中获取第一行的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres 中自我加入

使用具有不同 order by 子句的 postgres 窗口函数

如何使Postgres Copy忽略大文本文件的第一行

postgres:从带有参数的查询中获取可执行查询

SQL(Postgres)为列表参数中的每个项目获取一行,其优先顺序由另一列指定

从 postgres 日志中获取可执行查询