栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在GROUP BY中使用TOP之类的东西

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在GROUP BY中使用TOP之类的东西

您可以使用方便地检索每个组中名称最长的乘客

DISTINCT ON

  • 在每个GROUP BY组中选择第一行?

但是我看不到将它(或任何其他简单的方法)与您的原始查询合并在一个方法中的任何方法

SELECt
。我建议加入两个单独的子查询:

SELECT *FROM  (  -- your original query   SELECt orig        , count(*) AS flight_cnt        , count(distinct passenger) AS pass_cnt        , percentile_cont(0.5) WITHIN GROUP (ORDER BY bags) AS bag_cnt_med   FROM   table1   GROUP  BY orig   ) org_queryJOIN  (  -- my addition   SELECt DISTINCT ON (orig) orig, passenger AS pass_max_len_name   FROM   table1   ORDER  BY orig, length(passenger) DESC NULLS LAST   ) pas USING (orig);

USING
在join子句中方便地仅输出的一个实例
orig
,因此您可以
SELECT *
在外部简单地使用
SELECT

如果

passenger
可以为NULL,则添加
NULLS LAST
以下内容很重要:

  • PostgreSQL按datetime asc排序,是否为null?

从同一组中具有相同最大长度的多个乘客姓名中,您将获得 任意选择 -除非您添加更多表达式

ORDER BY
作为决胜局。上面链接的答案中有详细说明。

表现?

通常,单次扫描比较好,尤其是顺序扫描。

上面的查询使用 两次 扫描(可能是索引/仅索引扫描)。但是第二次扫描相对便宜,除非表太大(无法容纳)。卢卡斯建议的替换查询仅具有 单个

SELECT

加入:

, (ARRAY_AGG (passenger ORDER BY LENGTH (passenger) DESC))[1]  -- I'd add NULLS LAST

这个想法是聪明,但我最后一次测试,

array_agg
ORDERBY
没有如此上佳表现。(每个组的开销
ORDER BY
很大,并且数组处理也很昂贵。)

像Postgres
Wiki此处所指示的那样
,使用定制的聚合函数可以使同一方法更便宜。或者,使用PGXN上可用C编写的版本,速度更快。消除了数组处理的额外成本,但我们仍然需要每组。
可能* 只有少数几个组 更快 。然后,您将添加:

first()

ORDERBY
*

 , first(passenger ORDER BY length(passenger) DESC NULLS LAST)

戈登和卢卡斯也提到了窗口功能

first_value()
。窗口函数 聚合函数 之后
应用。要以同样的方式使用它
SELECT
,我们首先需要以
passenger
某种方式 进行聚合-捕获22。Gordon用子查询解决了这个问题-
另一个候选者,使用标准Postgres可以获得良好的性能。

first()
在没有子查询的情况下也一样,应该更简单,更快一些。但是
DISTINCTON
对于大多数情况,每组只有几行,它仍然不会比单独运行更快。对于每个组很多行,递归CTE技术通常更快。如果您有一个单独的表来保存所有相关的唯一
orig
值,那么还有更快的技术。细节:

  • 优化GROUP BY查询以检索每个用户的最新记录

最佳解决方案取决于各种因素。吃的时候有布丁的证明。要优化性能,您必须对设置进行测试。上面的查询应该是最快的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634874.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号