Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql WHERE子句保证奇异值时的唯一聚合函数_Sql_Postgresql_Aggregate Functions_Sql Limit - Fatal编程技术网

Sql WHERE子句保证奇异值时的唯一聚合函数

Sql WHERE子句保证奇异值时的唯一聚合函数,sql,postgresql,aggregate-functions,sql-limit,Sql,Postgresql,Aggregate Functions,Sql Limit,鉴于以下情况: CREATE TABLE A (A1 INTEGER, A2 INTEGER, A3 INTEGER); INSERT INTO A(A1, A2, A3) VALUES (1, 1, 1); INSERT INTO A(A1, A2, A3) VALUES (2, 1, 1); 我希望选择给定特定A2和A3值的最大A1,并使这些值(A2和A3)也显示在返回行中(例如,这样我可以在联接中使用它们,因为下面的选择是用于子查询的) 考虑到A2和A3在WHERE子句中是硬编码的,因

鉴于以下情况:

CREATE TABLE A (A1 INTEGER, A2 INTEGER, A3 INTEGER);

INSERT INTO A(A1, A2, A3) VALUES (1, 1, 1);
INSERT INTO A(A1, A2, A3) VALUES (2, 1, 1);
我希望选择给定特定
A2
A3
值的最大
A1
,并使这些值(
A2
A3
)也显示在返回行中(例如,这样我可以在联接中使用它们,因为下面的选择是用于子查询的)

考虑到A2和A3在
WHERE
子句中是硬编码的,因此能够执行以下操作似乎是合乎逻辑的:

SELECT MAX(A1) AS A1, A2, A3 FROM A WHERE A2=1 AND A3=1
然而,PostgreSQL(我也怀疑其他RDBMs)对此犹豫不决,并请求A2和A3的聚合函数,即使它们的值是固定的。因此,我要做的是:

SELECT MAX(A1) AS A1, MAX(A2), MAX(A3) FROM A WHERE A2=1 AND A3=1
或:

第一种选择我不喜欢,因为我可以使用
MIN
,但它仍然可以工作,而第二种选择将位置参数的数量增加一倍,以便在从编程语言接口使用时提供值。理想情况下,我想要一个
唯一的
聚合函数,该函数断言所有值都相等并返回单个值,或者甚至是一个
随机
聚合函数,该函数将随机返回一个值(因为我从
WHERE
子句中知道它们都相等)


有没有一种惯用的方式在PostgreSQL中编写上述内容?

这对您有用吗

select max(A1),A2,A3 from A GROUP BY A2,A3;
编辑

select A1,A2,A3 from A where A1=(select max(A1) from A ) limit 1
分组怎么样

select 
a2
,a3
,MAX(a1) as maximumVal
from a
group by a2, a3

更简单的是,您只需要按/
限制1

SELECT a1, a2, a3      -- add more columns as you please
FROM   a
WHERE  a2 = 1 AND a3 = 1
ORDER  BY 1 DESC      -- 1 is just a positional reference (syntax shorthand)
LIMIT  1;
LIMIT 1
是Postgres特有的语法。
其结果将是:

...
FETCH FIRST 1 ROWS ONLY
我的第一个答案是针对更复杂的情况,您希望根据
(a2,a3)
的各种组合检索最大
a1


旁白:我正在使用。

在不使用聚合函数的情况下获得最大行的标准技巧是通过NOT EXISTS子查询来避免缺少较大的值。(当存在连接时,这不起作用,但具有max的子查询也不起作用)在需要时,添加连接断开条件并不太困难

另一种解决方案是使用窗口函数
row\u number()
rank()


虽然我不喜欢使用groupby,但它确实可以工作,因为对于这个特定的用例来说,它是不直观的。我怀疑这归结为聚合函数不能断言或抛出异常,否则就可能出现唯一的()聚合;在这种情况下,仍然可以设想使用随机聚合函数,因为它在任何情况下都不必抛出异常。请尝试在编辑部分中的查询,该查询不应该是“ORDER BY a1 DESC LIMIT 1”,因为我需要给定a2和a3值的最大值(a1)?@MarcusJuniusBrutus:你说得对。我先误读了你的问题,想到了一个更复杂的案子。修正了,并作了一些解释
...
FETCH FIRST 1 ROWS ONLY
SELECT *
FROM a src
WHERE NOT EXISTS ( SELECT * FROM a nx
    WHERE nx.a2 = src.a2
    AND nx.a3 = src.a3
    AND nx.a1 > src.a1
    );