把范围变成布尔值

时间:2018-02-21 23:38:03

标签: sql postgresql

我想采取类似

的范围
SELECT * FROM generate_series(1,5);

generate_series
---------------
 1
 2
 3
 4
 5

并将其转换为类似

的内容
false
false
false
false
true

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

我试过

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

但由于某种原因,我只会返回1,我不太确定。

3 个答案:

答案 0 :(得分:1)

您可能需要window function

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

答案 1 :(得分:1)

它返回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;

答案 2 :(得分:1)

另一个窗口函数:LEAD()引用 next 行,并且对于最终记录为NULL。

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