PostgreSQL使用distinct关键字给单独的几列去重

本文深入探讨PostgreSQL中distinct关键字的高级应用,特别是在多列去重方面的技巧。不同于MySQL,PostgreSQL的distinct和groupby有其独特之处,文章详细介绍了如何仅根据特定列进行去重,同时展示所有感兴趣的列。

PostgreSQL使用distinct关键字给单独的几列去重

PostgreSQL去重问题一直困扰着我,distinct和group by远不如MySQL用起来随便,但是如果掌握了规律,还是和MySQL差不多的

主要介绍的是distinct关键字

在这里插入图片描述

select distinct id,name,sex,age from student

假如有一张student表,字段如上图,我查询student表中所有信息用distinct去重(上面的SQL语句),pgsql就会根据所有的字段通过算法取得重复行的第一行,但是很明显,ID这个字段我在设计的时候不会让它重复,所以相当于没有去重

我想只根据name和age去重怎么办?

可以这么写

select distinct on (name,age) id,name,sex,age from student

这样就会只根据name和age去重了

总结一下:distinct on (),括号里面的内容是要去重的列,括号外面的内容是你要查询展示的列,两者没有关系,你可以根据某些列去重不必将他们查询出来,最后这个举一个例子就是:

我要查询name和age,根据name和sex去重:
select distinct on (name,sex) name,age from student

### PostgreSQL 中 `DISTINCT ON` 的使用方法及适用场景 在 PostgreSQL 中,`DISTINCT ON` 是一个非常有用的功能,它允许你在查询结果中根据指定列,并返回每组中的第一条记录。与标准 SQL 中的 `DISTINCT` 不同,`DISTINCT ON` 可以结合 `ORDER BY` 使用,从而实现按某种排序规则选取每组中的一条记录,常用于获取每个分组中的“最新”或“最旧”记录[^1]。 #### 语法结构 ```sql SELECT DISTINCT ON (expression) select_list FROM table_name ORDER BY expression, order_column; ``` 其中,`expression` 是用于字段(通常为外键),`order_column` 控制每组中哪一条记录会被选中。PostgreSQL 会根据 `ORDER BY` 子句确定每组的第一条记录并保留。 #### 示例:获取每个用户的最新订单 假设有两个表: - `users(id, name)` - `orders(order_id, user_id, amount, created_at)` 要查询每个用户最新的订单信息,可以使用如下语句: ```sql SELECT DISTINCT ON (u.id) u.id AS user_id, u.name, o.order_id, o.amount, o.created_at FROM users u JOIN orders o ON u.id = o.user_id ORDER BY u.id, o.created_at DESC; ``` 此查询会对 `u.id` 分组,然后在每组中选择 `created_at` 最大的那条记录,即每个用户的最新订单[^1]。 #### 注意事项 - `DISTINCT ON` 的表达式必须出现在 `ORDER BY` 子句中。 - 若存在多条记录具有相同的 `DISTINCT ON` 字段值和 `ORDER BY` 排序值,则只会返回第一条。 - `DISTINCT ON` 是 PostgreSQL 特有的功能,在其他数据库系统中不可用。 #### 适用场景 - 查询某个关联实体的最新记录(如用户最近一次登录、商品最新价格等)。 - 在报告或仪表板中展示每个分类下的代表性数据。 - 避免使用子查询或窗口函数时,简化 SQL 逻辑。 #### 性能优化建议 - 为 `ORDER BY` 中涉及的时间字段建立索引,例如 `created_at`,以加速排序操作。 - 若 `DISTINCT ON` 字段是外键,也应为其建立索引,提高分组效率。 - 避免在大数据集上频繁使用 `DISTINCT ON`,必要时进行分页处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值