我知道如果在SELECT语句中有一个聚合函数,那么语句中的所有其他值必须是聚合函数,或者在GROUP BY子句中列出.我不明白为什么会这样.
如果我做:
SELECT Name, 'Jones' AS Surname FROM People
Run Code Online (Sandbox Code Playgroud)
我明白了:
NAME SURNAME
Dave Jones
Susan Jones
Amy Jones
Run Code Online (Sandbox Code Playgroud)
因此,DBMS从每一行获取一个值,并在结果集中为其附加一个值.没关系.但如果可行的话,我为什么不能这样做:
SELECT Name, COUNT(Name) AS Surname FROM People
Run Code Online (Sandbox Code Playgroud)
看起来是一样的想法,从每一行中取一个值并附加一个值.而不是:
NAME SURNAME
Dave 3
Susan 3
Amy 3
Run Code Online (Sandbox Code Playgroud)
我明白了:
您尝试执行不包含指定表达式"ContactName"的查询作为聚合函数的一部分.
我知道这是不允许的,但这两种情况看起来很相似,我不明白为什么.是否使DBMS更容易实现?如果有人能向我解释为什么它不能像我认为的那样起作用,我将非常感激.
可能重复:
在Postgres中将时间戳截断为5分钟的最快方法是什么?
Postgresql SQL GROUP BY时间间隔,任意精度(低至毫秒)
我想在PostgreSQL中以5分钟的间隔聚合数据.如果我使用该date_trunc()功能,我可以按小时,每月,每日,每周等间隔汇总数据,但不是5分钟或5天等特定间隔.
select date_trunc('hour', date1), count(*) from table1 group by 1;
Run Code Online (Sandbox Code Playgroud)
有谁知道我们如何在PostgreSQL中实现这一目标?
任何帮助表示赞赏.
我有与日期有关的记录:
DATE AMOUNT
16.03.2013 3
16.03.2013 4
16.03.2013 1
16.03.2013 3
17.03.2013 4
17.03.2014 3
Run Code Online (Sandbox Code Playgroud)
我知道如何总结每一天,但我怎么能在一周之前总结一下呢?
我需要在表上编写一个sql查询,以便结果将具有group by列以及带有逗号分隔符的聚合列.
我的表格将采用以下格式
|`````````|````````|
| ID | Value |
|_________|________|
| 1 | a |
|_________|________|
| 1 | b |
|_________|________|
| 2 | c |
|_________|________|
Run Code Online (Sandbox Code Playgroud)
预期结果应采用以下格式
|`````````|````````|
| ID | Value |
|_________|________|
| 1 | a,b |
|_________|________|
| 2 | c |
|_________|________|
Run Code Online (Sandbox Code Playgroud) sql sql-server select aggregate-functions sql-server-group-concat
我有一个表模式,其中包含一个int数组列,以及一个自定义聚合函数,它对数组内容求和.换句话说,给出以下内容:
CREATE TABLE foo (stuff INT[]);
INSERT INTO foo VALUES ({ 1, 2, 3 });
INSERT INTO foo VALUES ({ 4, 5, 6 });
Run Code Online (Sandbox Code Playgroud)
我需要一个可以返回的"sum"函数{ 5, 7, 9 }.正确运行的PL/pgSQL版本如下:
CREATE OR REPLACE FUNCTION array_add(array1 int[], array2 int[]) RETURNS int[] AS $$
DECLARE
result int[] := ARRAY[]::integer[];
l int;
BEGIN
---
--- First check if either input is NULL, and return the other if it is
---
IF array1 IS NULL OR array1 = '{}' THEN
RETURN array2;
ELSEIF …Run Code Online (Sandbox Code Playgroud) 我有下表MyTable:
id ? value_two ? value_three ? value_four
???????????????????????????????????????????
1 ? a ? A ? AA
2 ? a ? A2 ? AA2
3 ? b ? A3 ? AA3
4 ? a ? A4 ? AA4
5 ? b ? A5 ? AA5
Run Code Online (Sandbox Code Playgroud)
我想查询{ value_three, value_four }按组分组的对象数组value_two.value_two应该在结果中独立存在.结果应如下所示:
value_two ? value_four
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
a ? [{"value_three":"A","value_four":"AA"}, {"value_three":"A2","value_four":"AA2"}, {"value_three":"A4","value_four":"AA4"}]
b ? [{"value_three":"A3","value_four":"AA3"}, {"value_three":"A5","value_four":"AA5"}]
Run Code Online (Sandbox Code Playgroud)
它是否使用json_agg()或无关紧要array_agg().
然而,我能做的最好的事情是:
with MyCTE as ( select …Run Code Online (Sandbox Code Playgroud) 我在一个包含按位标志的表中有一个字段.让我们说为了示例,有三个标志:4 => read, 2 => write, 1 => execute表格如下所示*:
user_id | file | permissions
-----------+--------+---------------
1 | a.txt | 6 ( <-- 6 = 4 + 2 = read + write)
1 | b.txt | 4 ( <-- 4 = 4 = read)
2 | a.txt | 4
2 | c.exe | 1 ( <-- 1 = execute)
Run Code Online (Sandbox Code Playgroud)
我有兴趣找到在任何记录上设置了特定标志(例如:写入)的所有用户.要在一个查询中执行此操作,我认为如果您将所有用户的权限合并在一起,您将获得一个值,即其权限的"总和":
user_id | all_perms
-----------+-------------
1 | 6 (<-- 6 | 4 = 6)
2 | 5 (<-- …Run Code Online (Sandbox Code Playgroud) 我确信这已经被问到了,但我找不到合适的搜索条件.
给定这样的架构:
| CarMakeID | CarMake
------------------------
| 1 | SuperCars
| 2 | MehCars
| CarMakeID | CarModelID | CarModel
-----------------------------------------
| 1 | 1 | Zoom
| 2 | 1 | Wow
| 3 | 1 | Awesome
| 4 | 2 | Mediocrity
| 5 | 2 | YoureSettling
Run Code Online (Sandbox Code Playgroud)
我想生成这样的数据集:
| CarMakeID | CarMake | CarModels
---------------------------------------------
| 1 | SuperCars | Zoom, Wow, Awesome
| 2 | MehCars | Mediocrity, YoureSettling
Run Code Online (Sandbox Code Playgroud)
在以下样式查询中,我该怎么做以代替SQL Server中的字符串'AGG'?
SELECT *,
(SELECT …Run Code Online (Sandbox Code Playgroud) 我被困在这里.我在Postgres中有这样的排:
id amount
a 5000
a 1500
a 500
b 2000
b 1000
c 4000
Run Code Online (Sandbox Code Playgroud)
sql语法如何获得这样的结果?
id amount
a 7000
b 3000
c 4000
Run Code Online (Sandbox Code Playgroud) 这个问题是关于first_value()使用其他功能或解决方法的功能.
它也是关于大表中"性能上的微不足道".使用例如.max()在下面解释的上下文中,要求虚假比较.即使速度很快,也会产生一些额外的成本.
这种典型的查询
SELECT x, y, count(*) as n
FROM t
GROUP BY x, y;
Run Code Online (Sandbox Code Playgroud)
需要重复所有列GROUP BY以返回多个列.执行此操作的语法糖是使用位置引用:
SELECT x, y, count(*) as n
FROM t
GROUP BY x, 2 -- imagine that 2, 3, etc. are repeated with x
Run Code Online (Sandbox Code Playgroud)
有时不仅需要糖,还需要一些语义来理解复杂的上下文:
SELECT x, COALESCE(y,z), count(*) as n
FROM t
GROUP BY x, y, z -- y and z are not "real need" grouping clauses?
Run Code Online (Sandbox Code Playgroud)
我可以想象许多其他复杂的背景.让我们看看通常的解决方案:
SELECT x, max(y) as y, count(*) as n
FROM t …Run Code Online (Sandbox Code Playgroud)