如何从任意数量的表达式列表中选择中间值(中值)



我正在PostgreSQL中编写一个查询,其中我需要选择我正在传递的3个时间戳的中间值。我知道PostgreSQL中有Least和Greater函数,可以分别选择最小和最大的数字。

但在我的问题陈述中,我需要选择中间值,并想知道这样做的简单有效的方法?

查询:

select 
scvt.vc_id, 
least(start_time1,start_time2,start_time3) as "actual_class_start_time", -- <- the middle value of start times
from ...

我需要在突出显示的文本中选择中间值,有有效的方法吗?

如果每次正好有三个值,您可以执行一个自定义函数,从三个值中选择中间值:

CREATE OR REPLACE FUNCTION middleval(anyelement, anyelement, anyelement)
RETURNS date AS
$$
SELECT d
FROM (VALUES ($1), ($2), ($3)) AS t (d)
order by 1
offset 1
limit 1;
$$
LANGUAGE 'sql' IMMUTABLE;

然后你的代码会显示:

select scvt.vc_id, middleval (start_time1, start_time2, start_time3)

最新更新