postgresql - 如何在 Postgres 中实现 excel 的 SMALL 和 LARGE 函数?

标签 postgresql

LARGE让您找到数组中的第 n 个最大值。 SMALL让您找到数组中的第 n 个最小值。

我想做类似select SMALL([col1, col2, col3, 2], 2), LARGE([col1, col2, col3, 5], 2) from table1;

我不是在寻找 GREATEST and LEAST FUNCTIONS .我想找到第 n 个最小/最大值,而不是 最小/最大值。

最佳答案

实现很简单:

CREATE OR REPLACE FUNCTION large(anyarray, int)
 RETURNS anyelement AS $$
  SELECT (ARRAY(SELECT unnest($1) ORDER BY 1 DESC))[$2]
 $$ LANGUAGE sql;

postgres=# SELECT large(ARRAY[3,2,1,4,5,0], 2);
┌───────┐
│ large │
╞═══════╡
│     4 │
└───────┘
(1 row)

对于“小”函数 - 删除 ORDER BY 子句中的 DESC

该实现基于 unnest 函数 - 它将数组转换为表格。它按 ORDER BY 子句排序 - 与任何其他表一样。数组构造函数 ARRAY(subselect) 将排序关系转换为数组。

此函数使用多态参数 - 它类似于 C++ 中的模板。使用这些参数,此函数适用于任何数组类型。

关于postgresql - 如何在 Postgres 中实现 excel 的 SMALL 和 LARGE 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42083813/

相关文章:

sql - 在 Sequelize 模型中使用 Postgres 生成的列

java - 在运行一个过程后执行回滚

sql - 数据库作业调度

SQL:ENUM 与一对多关系的优势?

java - 如何防止交易在捕获时关闭(异常 e)?

Postgresql - 将导入时的 csv 时间和日期合并到时间戳

python - django.db.utils.OperationalError : FATAL: password authentication failed for user "postgres"

postgresql - 以与给定列表相同的顺序从 HQL 查询获取结果

postgresql - 将无界范围插入 TSRANGE Postgresql

json - 在 Nifi 中从 Avro Schema 创建 Postgresql 表