Warm tip: This article is reproduced from serverfault.com, please click

sql-计算多个最高和最低列值的差

(sql - Calculate difference of multiple highest and lowest column values)

发布于 2020-11-28 11:17:50

我有一个这样的表:

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。

Questioner
Mike Ehrmantraut
Viewed
0
Erwin Brandstetter 2020-11-28 21:20:52

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 BYLIMIT则可以附加到该子表达式。不带括号的话,这些子句将应用于的结果,而UNION不是其右手输入表达式。)

看:

这是假定salaryNOT NULL,否则将附加NULLS LAST到降序。看: