在 PostgreSQL 的窗口函数中按降序聚合排序

Posted

技术标签:

【中文标题】在 PostgreSQL 的窗口函数中按降序聚合排序【英文标题】:Order by descending aggregation within window function in PostgreSQL 【发布时间】:2021-02-14 15:55:36 【问题描述】:

我有一个包含主变量重复值的数据集,如下所示:

col1    col2    counts
110    False    1
111    False    2
111    False    1
112    True     3
112    False    2
112    False    1
113    False    1
114    False    1
115    False    2
115    False    1
116    False    1
117    False    1
118    False    4
118    False    3
118    False    2
118    False    1

我通过使用以下代码实现了这一点

SELECT DISTINCT ctm_nbr
,col1
,col2
,RANK () OVER (PARTITION BY col1 ORDER BY col2) AS counts
FROM my_table 
GROUP BY 1,2,3
ORDER BY ctm_nbr, row_numb DESC 

但是,需要对我想要的输出进行排序,以使 counts 下降而 col1 保持分区状态,以便我可以看到 col1 中的哪个值具有最高计数。像这样……

col1    col2    counts
118    False    4
118    False    3
118    False    2
118    False    1
112    True     3
112    False    2
112    False    1
115    False    2
115    False    1
111    False    2
111    False    1
110    False    1
113    False    1
114    False    1
116    False    1
117    False    1

我已经尝试了最终ORDER BY 子句的各种迭代,但不能完全产生我需要的输出。感谢指导。

【问题讨论】:

【参考方案1】:

您可以在order by 中使用窗口函数。我想你只是想要:

ORDER BY COUNT(*) OVER (PARTITION BY ctm_nbr) DESC,
         ctm_nbr,
         row_numb DESC 

这假定计数是row_numb() 的最大值。所以你也可以这样表达:

ORDER BY MAX(row_numb) OVER (PARTITION BY ctm_nbr) DESC,
         ctm_nbr,
         row_numb DESC 

【讨论】:

是的,这就行了。由于某种原因,我根本没有想到这一点。谢谢@Gordon Linoff。

以上是关于在 PostgreSQL 的窗口函数中按降序聚合排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 中按降序排列数据 - Python

如何在Android Firebase实时数据库中按降序获取孩子[重复]

如何在Ruby中按降序对数组进行排序

在Prolog中的元组列表中按降序排序

如何在php中按降序对数组进行排序?

如何使用extjs4.1在网格中按降序对带有连字符的浮点值进行排序