我有一个这样的表:
id | name | salary
------------------
1 | guy1 | 1000
2 | guy2 | 750
3 | guy3 | 400
4 | guy4 | 1000
5 | guy5 | 925
6 | guy6 | 900
我需要取最高薪水(在这种情况下为2 * 1000)和最低薪水(在这种情况下为1 * 400),并返回计算出的最高和最低薪水之间的差值,如下所示:
1000 * 2-400 * 1 = 1600
difference
----------
1600
我想过滤工资最高和最低但失败的表。
如果表为空,则结果应为0。
Postgres 13添加了该WITH TIES
子句以包括第n行的所有对等项:
如果你有一个索引salary
,它将尽可能快。比涉及窗口功能快得多:
SELECT COALESCE(sum(salary), 0) AS diff
FROM (
( -- parentheses required
SELECT salary
FROM tbl
ORDER BY salary DESC
FETCH FIRST 1 ROWS WITH TIES
)
UNION ALL
(
SELECT salary * -1
FROM tbl
ORDER BY salary
FETCH FIRST 1 ROWS WITH TIES
)
) sub;
db <>在这里拨弄
Postgres可以(salary)
直接从索引中获取第一个和最后一个值。无论表有多大,都可以实现准瞬时结果。
COALESCE()
获取0
而不是NULL
在表为空时获取。
为什么要加上多余的括号?手册:
(如果子表达式用括号括起来
ORDER BY
,LIMIT
则可以附加到该子表达式。不带括号的话,这些子句将应用于的结果,而UNION
不是其右手输入表达式。)
看:
这是假定salary
为NOT NULL
,否则将附加NULLS LAST
到降序。看: