Questions tagged «aggregate»

将多个数据点合并为一个数据点。通常用于引用SQL,通常用于某种聚合函数。

2
为什么array_agg()比非聚合ARRAY()构造函数慢?
我只是在回顾一些为8.4之前的PostgreSQL编写的旧代码,我发现确实很不错。我记得以前有一个自定义函数来执行某些操作,但我忘记了它的外观array_agg()。为了进行回顾,现代聚合是这样写的。 SELECT array_agg(x ORDER BY x DESC) FROM foobar; 但是,从前,它是这样写的, SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC); 因此,我尝试了一些测试数据。 CREATE TEMP TABLE foobar AS SELECT * FROM generate_series(1,1e7) AS t(x); 结果令人惊讶。#OldSchoolCool方法大大提高了速度:加快了25%。而且,在不使用ORDER的情况下对其进行简化显示出相同的慢度。 # EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar); QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Result (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 …

4
计算一行占总和的百分比
不好意思,我很抱歉,对此我不确定。 这是我目前正在使用的数据(的简化视图) Agent | Commission ---------|------------ Smith | 100 Neo | 200 Morpheus | 300 我需要计算每个代理商负责的总佣金百分比。 因此,对于史密斯探员,该百分比将计算为 (Agent Smith's commission / Sum(commission)*100 所以,我的预期数据是 Agent | Commission | % Commission ---------|---------------|--------------- Smith | 100 | 17 Neo | 200 | 33 Morpheus | 300 | 50 我有一个函数返回每个代理的佣金。我还有另一个函数将百分比返回(Commission/Sum(Commission))*100。问题是要Sum(commission)为每一行进行计算,并且考虑到此查询将在数据仓库上运行,因此数据集将相当大(当前,它的记录不足2000条),并且说实话,这是一种不好的方法(IMO )。 有没有一种方法可以Sum(Commission)不对正在获取的每一行进行计算? 我在考虑两部分查询的问题,第一部分将获取sum(commission)到包变量/类型中,第二部分将引用此预先计算的值,但是我不确定如何实现此目的。 我仅限于使用SQL,并且我在Oracle …

1
为什么需要汇总此流?
查看此查询。这非常简单(有关表和索引的定义以及repro脚本,请参见文章结尾): SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 AND 1 = (SELECT 1); 注意:“ AND 1 =(SELECT 1)只是为了防止此查询被自动参数化,我觉得这使问题感到困惑-尽管有或没有该子句,它实际上都得到相同的计划 这是计划(粘贴计划链接): 由于那里有一个“ top 1”,我很惊讶地看到流聚合运算符。对我来说似乎没有必要,因为保证只有一行。 为了检验该理论,我尝试了这个逻辑上等效的查询: SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 GROUP BY Id; 这是该计划(粘贴计划链接): 果然,按计划分组无需流聚合运算符就可以通过。 请注意,两个查询均从索引末尾读取“向后”,并执行“ top 1”以获取最大修订。 我在这里想念什么? 流聚合实际上是在第一个查询中进行工作,还是应该将其消除(这不是优化器的限制,而并非如此)? 顺便说一句,我意识到这不是一个非常实际的问题(两个查询都报告了0 ms的CPU和经过的时间),我只是好奇这里展示的内部/行为。 这是我在运行上述两个查询之前运行的设置代码: DROP TABLE IF EXISTS dbo.TheOneders; …

3
为什么使用GROUP BY子句比不使用GROUP BY子句的集合查询显着更快?
我很好奇为什么有GROUP BY子句的聚合查询比没有子句的查询运行得这么快。 例如,此查询将花费近10秒钟来运行 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 虽然这个过程不到一秒钟 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 GROUP BY CreatedDate CreatedDate在这种情况下只有一个,因此分组查询返回的结果与未分组查询相同。 我注意到两个查询的执行计划是不同的-第二个查询使用Parallelism,而第一个查询则没有。 如果SQL Server没有GROUP BY子句,则以不同的方式评估聚合查询是否正常?在不使用GROUP BY子句的情况下,我可以做些什么来提高第一查询的性能? 编辑 我刚刚学会了可以将OPTION(querytraceon 8649)并行性的开销开销设置为0,这使查询使用某种并行性,并将运行时间减少到2秒,尽管我不知道使用此查询提示是否有任何弊端。 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 OPTION(querytraceon 8649) 我仍然希望运行时间更短,因为查询是要在用户选择时填充一个值,因此理想情况下应该像分组查询一样是瞬时的。现在,我只是包装查询,但我知道这并不是理想的解决方案。 SELECT Min(CreatedDate) FROM ( SELECT Min(CreatedDate) as …


1
如何在Postgres中获取窗口函数的集合?
我有一张表,其中包含两列整数数组的排列/组合,第三列包含一个值,如下所示: CREATE TABLE foo ( perm integer[] NOT NULL, combo integer[] NOT NULL, value numeric NOT NULL DEFAULT 0 ); INSERT INTO foo VALUES ( '{3,1,2}', '{1,2,3}', '1.1400' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( …

4
如何编写加总一列以创建离散存储桶的窗口查询?
我有一个表,其中包含一列十进制值,例如: id value size -- ----- ---- 1 100 .02 2 99 .38 3 98 .13 4 97 .35 5 96 .15 6 95 .57 7 94 .25 8 93 .15 我需要完成的工作有点难以描述,因此请耐心等待。我正在尝试做的是创建size列的聚合值,每当前一行的总和为1时(根据降序排列),该列的值就会递增1 value。结果看起来像这样: id value size bucket -- ----- ---- ------ 1 100 .02 1 2 99 .38 1 3 …


2
获取联接表中聚合值的增量计数
我在MySQL 5.7.22数据库中有两个表:posts和reasons。每个帖子行都有并且属于许多原因行。每个原因都有一个相关的权重,因此每个帖子都有一个相关的总权重。 对于10个重量点的每个增量(即0、10、20、30等),我希望获得总权重小于或等于该增量的帖子数。我希望这样做的结果看起来像这样: weight | post_count --------+------------ 0 | 0 10 | 5 20 | 12 30 | 18 ... | ... 280 | 20918 290 | 21102 ... | ... 1250 | 118005 1260 | 118039 1270 | 118040 总权重大致呈正态分布,有一些非常低的值和一些非常高的值(当前最大值为1277),但大部分位于中间。大约有120,000行posts,而大约有120 行reasons。每个帖子平均有5或6个原因。 表格的相关部分如下所示: CREATE TABLE `posts` ( id BIGINT PRIMARY …

2
高效合并(删除重复项)数组
我有两个表,left2和right2。两个表都将很大(1-10M行)。 CREATE TABLE left2(id INTEGER, t1 INTEGER, d INTEGER); ALTER TABLE left2 ADD PRIMARY KEY (id,t1); CREATE TABLE right2( t1 INTEGER, d INTEGER, arr INTEGER[] ); ALTER TABLE right2 ADD PRIMARY KEY(t1,d); 我将执行这种类型的查询: SELECT l.d + r.d, UNIQ(SORT((array_agg_mult(r.arr))) FROM left2 l, right2 r WHERE l.t1 = r.t1 GROUP BY l.d …

1
通过多个联接对不同行求和
架构: CREATE TABLE "items" ( "id" SERIAL NOT NULL PRIMARY KEY, "country" VARCHAR(2) NOT NULL, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "price" NUMERIC(11, 2) NOT NULL ); CREATE TABLE "payments" ( "id" SERIAL NOT NULL PRIMARY KEY, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "amount" NUMERIC(11, 2) NOT NULL, …

2
在单个SELECT语句中返回多个范围的计数
我有一个Postgres数据库表foo,除其他外,该表的列score介于0到10之间。我希望查询返回总得分数,0到3之间的得分数,4之间的得分数和6,分数在7到10之间。类似以下内容: SELECT COUNT(*) as total, COUNT( SELECT * from foo where score between 0 and 3; ) as low, COUNT( SELECT * from foo where score between 4 and 6; ) as mid, COUNT( SELECT * from foo where score between 7 and 10; ) as high FROM foo; 我想这一点,但与得到一个错误SELECT的COUNT语句。有什么想法可以做到吗?我敢肯定Postgres中有一种超级简单的方法。我只是想不出正确的字词给Google。

2
数组integer []:如何获取表中所有不同的值并对其进行计数?
我对SQL(PostgreSQL)不太满意。这是我想做的: 我有一张桌子,字段: id SERIAL inet INET ports integer[] id | inet | ports ----+------------+------------ 2 | 1.2.2.1 | {80} 1 | 1.2.3.4 | {80,12} ... 我怎么能够 获取此表中所有使用的“端口”值:80、12 计算特定端口上有多少个Inet地址: 像这样: port | count --------+------------ 12 | 1 80 | 2 ... 如果有人在寻找它的Django版本: class Unnest(Func): function = 'UNNEST' Model.objects \ .annotate(port=Unnest('ports', distinct=True)) …

1
PostgreSQL中的SQL每小时​​数据聚合
我是数据库的新手,因此正在寻求您的帮助。 我有一个包含时间序列数据的表。 2012/01/01 00:10, 10 2012/01/01 00:30, 5 2012/01/01 01:00, 10 2012/01/01 01:40, 10 2012/01/01 02:00, 20 该表通过仅保留间隔的上限来存储基于间隔的数据。例如,第一行代表从[00:00-00:10]到10的间隔,第二行代表从(00:10-00:30]到5的间隔,第三行代表(00:30-01:00)的时间间隔,值为10。 我需要在Postgres中进行高效的查询,以汇总每小时数据,以获取上述结构。因此结果将是这样的: 2012/01/01 00:00, 2012/01/01 01:00, 25 2012/01/01 01:00, 2012/01/01 02:00, 30 请注意,时间序列数据很大,因此对其建立索引的任何帮助将不胜感激。 谢谢,丹

3
使用SUM()两次不是最佳选择?
我知道我必须写SUM两次,如果我想在HAVING子句中使用它(否则要使用派生表): SELECT id, sum(hours) AS totalhours FROM mytable GROUP BY id HAVING sum(hours) > 50; 我现在的问题是,这是否不是最理想的。作为程序员,该查询看起来像数据库将两次计算总和。是这样,还是我应该依靠数据库引擎为我做的优化? 更新:对类似查询的解释: postgres=> explain select sum(counttodo) from orderline group by orderlineid having sum(counttodo) > 100; QUERY PLAN -------------------------------------------------------------------- HashAggregate (cost=1.31..1.54 rows=18 width=8) Filter: (sum(counttodo) > 100) -> Seq Scan on orderline (cost=0.00..1.18 rows=18 width=8) (3 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.