将范围变成布尔值



我想参加

之类的范围
SELECT * FROM generate_series(1,5);
generate_series
---------------
 1
 2
 3
 4
 5

并将其变成看起来像

的东西
false
false
false
false
true

除非我们在最后一行,否则它总是是错误的。如果是0而不是false,而1而不是true也可以。

我尝试了

SELECT floor(gs::float / max(gs))
  FROM generate_series(1, 5) AS gs
 GROUP BY gs;

但这仅出于某种原因返回1,我不确定。

您可能想要一个窗口函数:

SELECT
  gs,
  row_number() OVER (ORDER BY gs DESC) = 1
FROM generate_series(1, 5) AS gs

它返回1,因为您总是将数字本身划分。max(gs)不做您的想法,因为您正在按gs进行分组。

您可以简单地使用last_value窗口函数来获取想要的东西,例如:

SELECT
    (gs = last_value(gs) over()) AS result
FROM
    generate_series(1,5) gs;

或如果您想要最大值(不一定是最后一个 - 可能是单个名字(:

SELECT
    (gs = max(gs) over()) AS result
FROM
    generate_series(1,5) gs;

又一个窗口函数: LEAD()指的是 next row,对于最终记录而言是无效的。


SELECT (lead(gs) OVER www IS NULL) AS is_last
        FROM generate_series(1,5) gs(gs)
        WINDOW www AS (order by gs)
        ;

最新更新