作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
鉴于以下情况:
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
) 也出现在返回的行中(例如,这样我就可以在连接中使用它们,因为下面的 SELECT 用于子查询)。
如果 A2 和 A3 在 WHERE
子句中硬编码,那么能够执行以下操作似乎合乎逻辑:
SELECT MAX(A1) AS A1, A2, A3 FROM A WHERE A2=1 AND A3=1
但是,PostgreSQL(我怀疑其他 RDBM 也一样)对此犹豫不决并请求 A2 和 A3 的聚合函数,即使它们的值是固定的。所以相反,我要么必须做一个:
SELECT MAX(A1) AS A1, MAX(A2), MAX(A3) FROM A WHERE A2=1 AND A3=1
或:
SELECT MAX(A1) AS A1, 1, 1 FROM A WHERE A2=1 AND A3=1
我不喜欢第一个替代方案,因为我可以使用 MIN
而它仍然有效,而第二个替代方案将位置参数的数量加倍,以便在从编程中使用时提供值语言界面。理想情况下,我想要一个 UNIQUE
聚合函数,它会断言所有值都相等并返回该单个值,或者甚至是一个 RANDOM
聚合函数,它会随机返回一个值(因为我从 WHERE
子句中知道它们都是相等的)。
在 PostgreSQL 中是否有一种惯用的方式来编写上述内容?
最佳答案
更简单,你只需要ORDER BY
/LIMIT 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 特定的语法。
SQL standard会是:
...
FETCH FIRST 1 ROWS ONLY
我的第一个答案是 DISTINCT ON
适用于更复杂的情况,您希望根据 (a2,a3)
a1
旁白:我正在使用 lower case identifiers for a reason .
关于sql - WHERE 子句保证奇异值时的唯一聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20149504/
我是一名优秀的程序员,十分优秀!