table1
如下表
+--------+-------+-------+------------+-------+
| flight | orig | dest | passenger | bags |
+--------+-------+-------+------------+-------+
| 1111 | sfo | chi | david | 3 |
| 1112 | sfo | dal | david | 7 |
| 1112 | sfo | dal | kim | 10|
| 1113 | lax | san | ameera | 5 |
| 1114 | lax | lfr | tim | 6 |
| 1114 | lax | lfr | jake | 8 |
+--------+-------+-------+------------+-------+
我正在按orig
如下方式汇总表格
select
orig
, count(*) flight_cnt
, count(distinct passenger) as pass_cnt
, percentile_cont(0.5) within group ( order by bags ASC) as bag_cnt_med
from table1
group by orig
我需要为每个组添加passenger
最长的名称(length(passenger)
)orig
-我该如何处理?
预期产量
+------+-------------+-----------+---------------+-------------------+
| orig | flight_cnt | pass_cnt | bags_cnt_med | pass_max_len_name |
+------+-------------+-----------+---------------+-------------------+
| sfo | 3 | 2 | 7 | david |
| lax | 3 | 3 | 6 | ameera |
+------+-------------+-----------+---------------+-------------------+
您可以使用方便地检索每个组中名称最长的乘客DISTINCT ON
。
但是我看不到将它(或任何其他简单的方法)与您的原始查询合并在一个方法中的任何方法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_query
JOIN ( -- 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
以下内容很重要:
从同一组中具有相同最大长度的多个乘客姓名中,您将获得 任意选择 -除非您添加更多表达式ORDER BY
作为决胜局。上面链接的答案中有详细说明。
通常,单次扫描比较好,尤其是顺序扫描。
上面的查询使用 两次 扫描(可能是索引/仅索引扫描)。但是第二次扫描相对便宜,除非表太大(无法容纳)。卢卡斯建议的替换查询仅具有 单个
SELECT
加入:
, (ARRAY_AGG (passenger ORDER BY LENGTH (passenger) DESC))[1] -- I'd add NULLS LAST
这个想法是聪明,但我最后一次测试,array_agg
有ORDER BY
没有如此上佳表现。(每个组的开销ORDER BY
很大,并且数组处理也很昂贵。)
像Postgres
Wiki此处所指示的那样
,使用定制的聚合函数可以使同一方法更便宜。或者,使用PGXN上可用C编写的版本,速度更快。消除了数组处理的额外成本,但我们仍然需要每组。
可能* 只有少数几个组 更快 。然后,您将添加: first()
ORDER BY
*
, first(passenger ORDER BY length(passenger) DESC NULLS LAST)
戈登和卢卡斯也提到了窗口功能first_value()
。窗口函数 在 聚合函数 之后
应用。要以同样的方式使用它SELECT
,我们首先需要以passenger
某种方式 进行聚合-捕获22。Gordon用子查询解决了这个问题-
另一个候选者,使用标准Postgres可以获得良好的性能。
first()
在没有子查询的情况下也一样,应该更简单,更快一些。但是DISTINCT ON
对于大多数情况,每组只有几行,它仍然不会比单独运行更快。对于每个组很多行,递归CTE技术通常更快。如果您有一个单独的表来保存所有相关的唯一orig
值,那么还有更快的技术。细节:
最佳解决方案取决于各种因素。吃的时候有布丁的证明。要优化性能,您必须对设置进行测试。上面的查询应该是最快的。
我编写的gherkin特性文件如下所示: 现在,由于有多个查询要测试不同的参数,如“雇员”,“部门”…等等,编写场景大纲来执行任务是很自然的: 其中json_string_expected_for_employee只是: null 或者有什么解决办法吗?这一定是人们在Cucumber中比较非琐碎数据输出的常见场景。 谢谢,
当我使用或方法时,我得到了错误的结果。 例如: 在另一种方法中,我只得到结果1 我得到了正确的结果。 当使用方法时,我得到了错误的结果。 https://github.com/laravel/framework/issues/14123 忘了说,我的laravel版本信息: 项目中的实际问题 我有一张充电记录表。 1.pay日志表 1.1支付日志talbe数据 2.说明 在pay_log表中,1和
本文向大家介绍Bootstrap navbar-fixed-top类的用法,包括了Bootstrap navbar-fixed-top类的用法的使用技巧和注意事项,需要的朋友参考一下 使用Bootstrap类.navbar-fixed-top将导航栏固定在顶部。 您可以尝试运行以下代码将导航栏修复到顶部- 示例
问题内容: 我正在尝试像这样计算折线的面积 后来我注意到dbgeometry无效的错误的原因我尝试了ms sql 2012中的代码也给了我错误,但是当我尝试那样的时候 多数民众赞成在SQL工作我的问题是有没有使几何在.net有效的谢谢 问题答案: 我同意Bojan,除非您使用的是实体框架? SqlGeometry对象具有MakeValid()函数,因此,使用您的示例,可以在DbGeography和
本文向大家介绍Linux中使用top命令的技巧,包括了Linux中使用top命令的技巧的使用技巧和注意事项,需要的朋友参考一下 首先介绍top中一些字段的含义: VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 RES:res
问题内容: 我正在使用CURSOR进行逐行操作。 我想知道为什么不能并行执行此操作,因为行操作是完全隔离的,只能将一些行插入到另一个表中,并且每一行都有自己的ID分配,因此不存在发生冲突的明显可能性。 我想知道是否有一种方法可以在纯SQL中并行化它? 问题答案: 这通常是通过队列来实现的:选择“待办事项”项并将其放入队列,同时队列读取器(处理线程)将“待办事项”项出队并逐一处理。将表用作队列是一种