Questions tagged «group-by»

GROUP BY:通用值的SQL聚合

2
为什么GROUP BY语句中的通配符不起作用?
我正在尝试使以下SQL语句正常工作,但出现语法错误: SELECT A.*, COUNT(B.foo) FROM TABLE1 A LEFT JOIN TABLE2 B ON A.PKey = B.FKey GROUP BY A.* 在这里,A是一个有40列的宽表,如果可能的话,我想避免在GROUP BY子句中列出每个列的名称。我有很多这样的表,必须在这些表上运行类似的查询,因此我必须编写一个存储过程。解决此问题的最佳方法是什么? 我正在使用MS SQL Server 2008。


2
提高大型PostgresSQL表中COUNT / GROUP-BY的性能?
我正在运行PostgresSQL 9.2,并具有12列的关系,大约有6,700,000行。它包含3D空间中的节点,每个节点都引用一个用户(创建它的用户)。为了查询哪个用户创建了多少个节点,我执行以下操作(添加explain analyze以获得更多信息): EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1) -> Seq Scan on treenode (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1) Filter: (project_id = 1) Total runtime: 1747.653 ms 如您所见,这大约需要1.7秒。考虑到数据量,这还算不错,但是我想知道是否可以改进。我试图在用户列上添加一个BTree索引,但这没有任何帮助。 您还有其他建议吗? 为了完整起见,这是完整的表定义及其所有索引(没有外键约束,引用和触发器): Column …

6
选择json_agg内的列
我有一个查询,如: SELECT a.id, a.name, json_agg(b.*) as "item" FROM a JOIN b ON b.item_id = a.id GROUP BY a.id, a.name; 如何选择JSON对象中b没有的列b.item_id? 我已经阅读了有关ROW,但它返回的JSON对象如下: {"f1": "Foo", "f2": "Bar"} 一旦提取JSON对象以匹配正确的列键,我将需要重新映射。我想避免这种情况,并保留原始列名称。

6
计算连续两列或多列超过某个值的位置[篮球,双倍双倍,三倍双倍]
我玩篮球游戏,它允许将其统计信息输出为数据库文件,因此可以从中计算出在游戏中未实现的统计信息。到目前为止,我可以很轻松地计算出我想要的统计数据,但是现在我遇到了一个问题:从一个赛季的比赛统计数据中计算出一个球员本赛季创造的双打和/或双打的数量。 双精度双精度和三重精度双精度的定义如下: 双双: 双打被定义为一种表现,其中玩家在游戏中累积五个统计类别中的两个统计的两位数总数(点,篮板,助攻,抢断和盖帽)。 三双: 三重双打被定义为一种表现,其中玩家在游戏中五个统计类别中的三个统计点(得分,篮板,助攻,抢断和盖帽)中累计两位数。 四重双(为清楚起见添加) 四重双打是指在游戏中,玩家在五个统计类别中的四个统计类别中(得分,篮板,助攻,抢断和盖帽)累计两位数的表现。 “ PlayerGameStats”表存储了玩家玩的每个游戏的统计信息,外观如下: CREATE TABLE PlayerGameStats AS SELECT * FROM ( VALUES ( 1, 1, 1, 'Nuggets', 'Cavaliers', 6, 8, 2, 2, 0 ), ( 2, 1, 2, 'Nuggets', 'Clippers', 15, 7, 0, 1, 3 ), ( 3, 1, 6, 'Nuggets', 'Trailblazers', 11, …

1
使用子查询时,Postgres错误[列必须出现在GROUP BY子句中或在聚合函数中使用]
我有两个桌子employee和phones。员工可以使用0到n个电话号码。我想列出员工姓名和他们的电话号码。我正在使用下面的查询运行正常。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 员工表可能包含大量行。我一次只想获取一些员工。例如,我想获取3名员工的电话号码。我正在尝试运行此查询。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM (SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 但是我得到这个错误。ERROR: column …

6
从表中查找“ n”个连续的免费电话
我有一些这样的数字表(状态为免费或已分配) id_set号状态 ----------------------- 1 000001已分配 1 000002免费 1 000003已分配 1 000004免费 1 000005免费 1 000006已分配 1 000007已分配 1 000008免费 1 000009免费 1 000010免费 1 000011已分配 1 000012分配 1 000013已分配 1 000014免费 1 000015已分配 并且我需要找到“ n”个连续数字,因此对于n = 3,查询将返回 1 000008免费 1 000009免费 1 000010免费 它应仅返回每个id_set的第一个可能的组(实际上,每个查询仅对id_set执行一次) 我正在检查WINDOW函数,尝试了诸如之类的查询COUNT(id_number) OVER (PARTITION BY id_set ROWS …

2
如何选择多个列但只能按一个列分组?
我有一个问题group by,我想选择多列,但仅按一列分组。下面的查询是我尝试的,但是给了我一个错误。 SELECT Rls.RoleName,Pro.[FirstName],Pro.[LastName],Count(UR.[RoleId]) as [Count] from [b.website-sitecore-core].[dbo].[aspnet_UsersInRoles] UR inner join [b.website-professional-au].[dbo].[Profile] Pro on UR.UserId = Pro.Id inner join [b.website-sitecore-core].[dbo].[aspnet_Roles] Rls on Rls.RoleId = UR.RoleId inner join [b.website-professional-au].[dbo].[Gender] Gn on gn.Id = pro.GenderId GROUP BY Rls.RoleName;

4
使用GROUP BY和ORDER BY对大表进行慢查询
我有一张桌子,上面有720万个元组,看起来像这样: table public.methods column | type | attributes --------+-----------------------+---------------------------------------------------- id | integer | not null DEFAULT nextval('methodkey'::regclass) hash | character varying(32) | not null string | character varying | not null method | character varying | not null file | character varying | not null type | character varying | …

7
分组或窗口
我有一种情况,我认为可以使用窗口函数解决,但我不确定。 想象一下下表 CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 ), …

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; …

4
如何获得计数为零的组?
我将尝试从SQL Server数据库中的数据制作图形。我会在所有街道上都看到这条街上生活的用户数,即使计数为零。 为此,我尝试了以下查询: Create table Streets( ID int IDENTITY primary key, Name varchar(100) ); create table users( ID int IDENTITY primary key, Username varchar(100), StreetID int references Streets(id) ); insert into streets values ('1st street'), ('2nd street'), ('3rd street'), ('4th street'), ('5th street'); insert into users values ('Pol', 1), ('Doortje', …

2
SQL连接查询以显示一个表中不存在行的行
我正在尝试完成一些有关员工时间记录的报告。 我们有两个专门针对此问题的表格。Members表中列出了员工,他们每天输入他们已执行的工作的时间条目并将其存储在Time_Entry表中。 使用SQL Fiddle进行设置的示例:http ://sqlfiddle.com/#!3/e3806/7 最终的结果我要的是一个表,表示所有的Members列中的列表,然后将展示他们的总和小时,在其他列查询的日期。 问题似乎是,如果Time_Entry表中没有特定成员的行,那么该成员现在将有一行。我尝试了几种不同的联接类型(左,右,内部,外部,完全外部等),但似乎没有一种能满足我的要求(基于SQL Fiddle的最后一个示例): /*** Desired End Result ***/ Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL ADavis | 0 | 11-10-2013 | 0 | 0 BTronton | 0 | 11-10-2013 | 0 | 0 CJones | 0 | 11-10-2013 | 0 | 0 DSmith …

1
SQL规范是否要求EXISTS()中的GROUP BY
Microsoft当前允许使用此语法。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); 请注意,GROUP BY该EXISTS子句中没有有效的ANSI SQL。还是仅公开实现细节。 作为参考,PostgreSQL不允许使用相同的语法。 错误:“ tx”列必须出现在GROUP BY子句中或在聚合函数中使用 但是允许使用此语法。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS …

2
选择满足组条件的行(无临时表)
该表具有3列: ID category flag 1 A 1 2 A 0 3 A 0 4 B 0 5 C 0 我想选择flag = 1每个类别至少具有一次的所有行。 预期成绩: ID category flag 1 A 1 2 A 0 3 A 0 可以使用如下临时表来解决: select ID into #tempTable from someTable where flag = 1 select * from someTable …

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.