sql - 每个组都有多个结果的 max 函数
问题描述
我正在寻找有关 postgresql 查询的帮助。
示例输入数据如下:
pk name
=========================
1 | notebook cz-2001
2 | notebook cz-2002
3 | notebook cz-2003
4 | notebook cz-2003
5 | notebook cz-2003
6 | notebook cz-2004
7 | notebook cz-2004
8 | notebook cz-2004
9 | notebook cz-2004
10 | notebook cz-2005
11 | notebook cz-2006
12 | notebook cz-2007
13 | notebook cz-2008
14 | notebook cz-2009
某些行在名称列中具有相同的值(笔记本 cz-2003、笔记本 cz-2004)
我可以通过以下查询获得分组名称的一个最大 pk 值:
select * from test_group where pk in
(
select max(pk) from test_group group by name order by name
)
结果:
pk name
=========================
1 | notebook cz-2001
2 | notebook cz-2002
5 | notebook cz-2003
9 | notebook cz-2004
10 | notebook cz-2005
11 | notebook cz-2006
12 | notebook cz-2007
13 | notebook cz-2008
14 | notebook cz-2009
但我不知道,这是我的问题,例如如何获得分组名称的两个(三个、四个 ...)最高 pk 值。
例如两个最高 pk 的预期结果:
pk name
=========================
1 | notebook cz-2001
2 | notebook cz-2002
4 | notebook cz-2003
5 | notebook cz-2003
8 | notebook cz-2004
9 | notebook cz-2004
10 | notebook cz-2005
11 | notebook cz-2006
12 | notebook cz-2007
13 | notebook cz-2008
14 | notebook cz-2009
你能给我一些提示如何实现吗?
谢谢
J.P
解决方案
您可以为此使用row_number()
窗口函数:
SELECT pk, name
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY pk DESC)
FROM my_table
) s
WHERE row_number <= 2 -- or any other value
row_number()
窗口函数将行号添加到某个有序组。在这里,您的组是name
列,顺序是按pk
(降序,因为您希望首先计算最高数字)。
使用该WHERE
子句,您可以过滤前 n 条记录(编号为 1、2、...)或您喜欢的任何其他元素。
推荐阅读
- ionic-framework - 如何创建 php 脚本以在 ionic 应用程序中发送电子邮件
- android - 使用 Android Management API 创建策略 - 快速入门 Colab
- ios - 在 UIWindow 上添加的视图中添加手势识别器
- apache-spark - 为什么使用 spark 的 QuantileDiscretizer 得到的结果分组不均匀?
- c# - 如何仅读取添加到事件日志中的新事件?
- python - 如何删除第一级索引,然后将剩余的索引值与 pd DataFrame 的自定义逻辑合并?
- javascript - 如何使用 javascript 将 onclick 事件添加到表格单元格?
- python - Python - UnicodeDecodeError:'charmap'编解码器无法解码位置 1070 的字节 0x9d:字符映射到
- python - 双引号在python中显示为菱形问号
- kubernetes - Kubernetes metrics-server:来自服务器的错误(ServiceUnavailable):服务器当前无法处理请求