postgres select TOP X in group 查询每个组的前几名
参考:
https://stackoverflow.com/questions/27415706/postgresql-select-top-three-in-each-group
http://charlesnagy.info/it/postgresql/group-by-limit-per-group-in-postgresql
但实在看不懂这里面LATERAL的用法,而且语法和pg11似乎也有了区别。
这个里面的LATERAL用法倒是看懂了,把LATERAL当成foreach来用:
https://www.oschina.net/translate/postgresqls-powerful-new-join-type-lateral?cmp
简单说,用LATERAL JOIN2个子查询:
1 GROUP BY 得到聚合后的分组
2 再用这个数量缩水的 用WHERE inner.grp = outer.grp 去过滤没缩水前的全部数据。排序得到查询结果
最终外面再包1层select
——但如果inner是个view 等于里面要扫描N次 N等于1的group数量。
我的分组有点多,几百个,实测结果:要5秒钟,实在不能忍,性能太差了
最后,还是用https://stackoverflow.com/questions/27415706/postgresql-select-top-three-in-each-group
里面最直接的窗口函数法,1次FROM就搞定,400ms,就算凑合了
SELECT *
FROM(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY grp
ORDER BY value DESC) AS order_in_grp
FROM table1
) AS A
WHERE order_in_grp < 2
子查询里用窗口函数得到每个分组内的序号order_in_grp:按grp字段分组,组内按value降序的序号
外层只是用WHERE过滤出每个组内前1名。
对我这种新手来说,还是这样简单、直接、标准语法的方式更适合我。怎么用LATERAL才能效率高,暂时无暇顾及了。
起码符合The Zen of Python的前几条
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
心得
不是看见分组就一定要GROUP BY, 窗口函数这样反而更灵活——不聚合,而是,在子查询里给出组内排名order_in_grp字段,然后在外面做1次WHERE把每个分组的前N名过滤出来。
postgres select TOP X in group 查询每个组的前几名的更多相关文章
- 如何在MySQL中查询每个分组的前几名【转】
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...
- 如何在mysql中查询每个分组的前几名
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...
- mysql 查询每个分组的前几名
按分组排序,并查出每个分组的前3名 单表 SELECT * FROM ( SELECT ZONEID, uid, NAME, fight, IF ( , ) AS rank, ( @zone := z ...
- mysql查询每个部门/班级前几名
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id . +----+-------+--------+--------------+ | I ...
- SQL使用开窗函数与CTE查询每月销售额的前几名
WITH tagTab AS( SELECT YearMonth, pm=RANK() OVER(PARTITION BY YearMonth ORDER BY amount DESC) FROM S ...
- mysql 查询每个班级成绩前两名
- 查询出各个学科的前3名的同学信息的Sql
查找各个学科的成绩前3名的学生信息Sql,有2种方法,一种是利用sql的row_number() over()函数,另一种是用子查询, 表设计如下 如果不考虑各个学科的成绩有并列的情况的话,有如下两种 ...
- 数据库学习笔记3 基本的查询流 2 select lastname+','+firstname as fullname order by lastname+','+firstname len() left() stuff() percent , select top(3) with ties
数据库学习笔记3 基本的查询流 2 order by子句对查询结果集进行排序 多列和拼接 多列的方式就很简单了 select firstname,lastname from person.pers ...
- Solr --- Group查询与Facet区别
简介 facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索. group则类似于关系数据库的group by,可以用于一个或者几个字段 ...
随机推荐
- eclipse sts 断点不起作用,把这行 勾上 就行
- Linux 查看文件内容(8)
我们知道在图形界面上查看文件内容只需要双击打开就好,那么在终端窗口里怎么查看文件内容呢?显然是需要能有一个命令能把文件内容显示在终端界面上. 查看文件内容主要有两个命令,分别是 cat 和 more, ...
- Git-版本控制 (三)
前面两篇我们成功安装了Git,并且成功创建了我们的版本库. 创建了版本库,怎么可以不往里面放内容呢,所以今天的任务就是学会将文件放入至我们的版本库中...... 首先,我们点开我们的"Git ...
- 两张超级大表join优化
一个简单的两表关联,SQL跑了差不多一天一夜,这两个表都非常巨大,每个表都有几十个G,数据量每个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G ...
- 087、日志管理之 Docker logs (2019-05-09)
参考https://www.cnblogs.com/CloudMan6/p/7749304.html 高效的监控和日志管理对保持生产系统只需稳定的运行以及排查问题至关重要. 在微服务架构中,由 ...
- 企业面试题|最常问的MySQL面试题集合(二)
MySQL的关联查询语句 六种关联查询 交叉连接(CROSS JOIN) 内连接(INNER JOIN) 外连接(LEFT JOIN/RIGHT JOIN) 联合查询(UNION与UNION ALL) ...
- PHP hex文件及bin文件读取
背景:做物联网时经常会有软件上传这种操作,上传的软件包文件常见的是hex和bin这两种. 一 hex文件读取 1 首先我们需要了解hex文件内容格式 (图及下面说明来自网络,侵权必删) :(冒号)每个 ...
- 6.纯css绘制叮当猫
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 在django项目中,单独运行python文件
在from models import * 上面加上以下代码 import os; os.environ.setdefault("DJANGO_SETTINGS_MODULE", ...
- 总结下Nginx的功能模块
nginx-1.10.3]# ./configure \ --prefix=/usr/local/nginx \ #指定安装路径 --user=nginx --group=ngin ...