PostgreSQL(十)distinct on 的用法

目录

    • 一、背景
    • 二、定义
    • 三、实现需求

一、背景

SQL需求:

假设有一个用户表,我们想根据用户的部门(depart_no)进行分组,找出每个组织中的任意一人。

在 PostgreSQL 中,如果要实现上面这个需求,假设存在唯一主键(id),可能会有人想到用下面这种方式来查询:

select * from t_user_info
where id in (select min(id) from t_user_info group by depart_no);

首先,如果使用上面这个 SQL 会导致 t_user_info 表查询两遍,效率不高。

其次,如果条件变一下,想找出每个部门(depart_no)中年龄(age)最小的人,这样的话像上面使用单个子查询方式就无法实现了,因为每个部门中的最小年龄有可能是重复的。除非使用两个子查询:

select * from t_user_info
where id in (select min(t1.id) from t_user_info t1 (select depart_no, min(age) age from t_user_info group by depart_no) t2where t1.depart_no = t2.depart_no and t1.age = t2.agegroup by t1.depart_no);

这样虽然实现了,但是有一个前提条件是:表中必须存在唯一主键,而且 三个子查询导致 SQL 的可维护性和效率进一步降低了。在生产环境上,我们 严令禁止这种难以维护的 SQL 出现在我们的代码中

这时候,就到了我们的主角 distinct on 上场了。


二、定义

distinct on:是 PostgreSQL 中一种独特的 SQL 语法,用于在一组重复的记录中选取每个分组的第一条记录。不同于普通的 distinct 关键字,distinct on 允许指定某些列用于区分唯一性,并且可以控制每个分组返回表中存在的任意字段,不同于 group by 关键字,并 不局限于只能查询、排序用于分组的字段

注意: 排序的话,必须要包含用于分组的字段,比如:分组字段是 depart_no,排序可以是 order by depart_no, age,也可以是 order by age, depart_no,但是必须要包含 depart_no。

基本语法如下:

select distinct on (column1, column2, ...) expression1, expression2
from table_name
[where conditions]
[order by column1, column2, ...];
  • column1, column2, ...:这是用于区分唯一性的字段列表,distinct on 会根据这些列找出各组的第一行。
  • expression1, expression2, ...:这是你想要查询的字段或者表达式,这些数据来自根据 distinct on 中的字段去重后所对应的每组数据的第一行。
  • table_name:要查询的表名。
  • [where conditions]:可选的筛选条件,用于进一步过滤数据。
  • [order by column1, column2, ...]:可选的排序条件,包含但不局限于分组的字段。distinct on 的关键在于需要有一个明确的排序,因为 distinct on 返回的是每个分组中按照 order by 排序后的第一条记录。

三、实现需求

现在,我们再用 distinct on 来重新实现一遍我们的需求:(假设有一个用户表,我们想根据用户的部门(depart_no)进行分组,找出每个组织中的任意一人。)

select distinct on (depart_no) * from t_user_info;

一个 SQL 直接解决!不需要任何子查询,也不需要唯一主键。

我们再来看下问题的升级版:(想找出每个部门(depart_no)中年龄(age)最小的人)

select distinct on (depart_no) * from t_user_info order by depart_no, age;

同样非常简单,非常优雅,这么方便的 distinct on 你学会了吗?

整理完毕,完结撒花~ 🌻





参考地址:

1.pgsql中distinct on的用法,https://blog.csdn.net/qq_24702263/article/details/105311212

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

子域名收集

目录 1、OneForAll 2、利用Google的搜索 3、fofa 4、使用在线查询网站查询 5、利用ip反查 6、Layer子域名挖掘机 7、JSFinder 用法 在进行渗透的过程中有一个很重要的工作就是信息收集,而信息收集中的子域名收集是很重要的一项工作,在本篇中我会给大…

绝地求生:【PC】2024年1月商店更新

亲爱的玩家朋友们,大家好! 欢迎大家来到闲游盒2024年首次商店更新! 我们在1月商店更新中准备了全新生存通行证:龙腾,彩色烟雾皮肤,地狱天使 VS 天堂恶魔系列皮肤,相信大家一定会喜欢~ 实用腰带…

Linux操作系统——进程控制(三) 进程程序替换

前言 目前我们接触到我们所创建的所有的子进程,它执行的代码都是父进程代码的一部分!那么如果我们想让子进程执行新的程序呢???执行全新的代码和访问全新的数据,不在和父进程有瓜葛,我们该怎么…

一文详解向量数据库Milvus Cloud动态 Schema

在数据库中,Schema 常有,而动态 Schema 不常有。 例如,SQL 数据库有预定义的 Schema,但这些 Schema 通常都不能修改,用户只有在创建时才能定义 Schema。Schema 的作用是告诉数据库使用者所希望的表结构,确…

如何利用 NFTScan Portfolio 功能分析钱包 NFT 持仓

随着 NFT 市场的扩大和投资者的增加,追踪和管理大量 NFT 资产正变得越来越复杂,无论是新手还是资深投资者,都需要借助实时的 NFT 数据作为判断依据。因此,一个能够全面分析 NFT 钱包持仓的工具就显得尤为重要。帮助投资者掌握自身…

bootstrap搭建一个简单的官网案例附代码

bootstrap搭建一个简单的官网案例附代码 效果常用属性完整代码 效果 大概的效果如下 主要都是用bootstrap的代码实现的 网站是照着 b站视频做的 查看视频教程 建议自己先看一遍文档再跟着视频写,不然可能看不懂 bootstarp中文文档 logo是从别人的站上扒的有点不太协…

阿里巴巴提出AnyText:首个解决多语言视觉文本生成的工作

基于扩散模型的文本到图像在最近取得了令人瞩目的成就。尽管当前的图像合成技术已经非常先进,能够以高保真度生成图像,但当关注生成图像中的文本区域时,往往可能会暴露问题,因为合成文本通常包含模糊、不可读或不正确的字符&#…

firewalld高级配置

IP伪装与端口转发 在互联网发展初期,设计者们并没有想到互联网会发展到现在这个空前繁荣的阶段,所以,设 计的Pv4地址空间只有32位.但是随着互联网的发展,P地址变得严重缺乏,并且地址分配不均匀, 所以就在原…

设计模式-规格模式

设计模式专栏 模式介绍模式特点应用场景规格模式和策略模式的区别和联系代码示例Java实现规格模式Python实现规格模式 规格模式在spring中的应用 模式介绍 规格模式(Specification Pattern)是一种行为设计模式,其目的是将业务规则封装成可重…

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型,以学习使用给定风格生成文本,接下来,我们将学习如…

WPF 实现Popup不在最上层显示、随窗口移动

文章目录 前言一、定义类继承Popup类二、使用1.在XAML头部加入链接2. 在XAML文件使用 总结 前言 由于WPF 默认的Popup总是显示在所有窗口的前面,如何让popup 层只显示在该父级之上,并随着父级而动呢?下面来看实现。 一、定义类继承Popup类 …

OceanBase原生分布式数据库

1.历史背景 在Java Web项目中,常常使用免费开源的MySQL数据库存储业务数据,按业界经验MySQL单库超过多大数据体量,或单表超过几百万条数据后就会出现查询变慢的情况,单实例数据库只能扩展物理资源(CPU、内存),来提升查…

vivado 工程管理

管理项目 打开项目 当项目打开时,Vivado IDE会从项目已关闭。项目状态包括当前源文件顺序、已禁用和已启用 源文件、活动约束文件和目标约束文件,以及合成、模拟和实现运行。要打开项目,请使用以下方法之一: •在“入门”页面…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说,在短时间内开发一款高质量设备专用软件,是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台,让客户快速高效的开发自己的设备专…

异构图 神经网络xFraud :Explaniable Fraud transcation detection

适用于异构图 2. 使用图进行异常检测 https://github.com/safe-graph/graph-fraud-detection-papers

01.大型语言模型背后的基本概念的高级解释 (LLMs)

像 ChatGPT 这样的大型语言模型 (LLMs) 是过去几年开发的深度神经网络模型。他们开创了自然语言处理(NLP)的新时代。在大型语言模型出现之前,传统方法擅长分类任务,例如垃圾邮件分类和简单的模式识别,这些任务可以通过手工制定的规则或更简单的模型来捕获。然而,它们通…

Android 通知简介

Android 通知简介 1. 基本通知 图1: 基本通知详情 小图标 : 必须提供,通过 setSmallIcon( ) 进行设置.应用名称 : 由系统提供.时间戳 : 由系统提供,也可隐藏时间.大图标(可选) : 可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过setLargeIcon( ) 进行设置.标题 : 可选…

浅谈 Android焦点管理机制 事件分发机制

什么是焦点 焦点能够让 视图和窗口 可以接受和处理 按键事件和导航事件 。在 Android 中,按键事件和导航事件通常指的是 与物理按键和输入设备(如键盘、遥控器、游戏手柄等)相关的交互事件 。 焦点的处理对于非触摸屏设备(如电视…

【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

2024-1-11 文章目录 [2645. 构造有效字符串的最少插入数](https://leetcode.cn/problems/minimum-additions-to-make-valid-string/)方法一:计算组数方法二:动态规划方法三: 考虑相邻字母 2645. 构造有效字符串的最少插入数 方法一:计算组数 …

uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化

文章目录 Recorder-UniCore插件特性集成到项目中调用录音上传录音ASR语音识别 在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能,uniapp自带的recorderManager接口不支持H5、录音格式和实时回调onFrameRecorded兼容性不好,用Recorder插件可避免…