Sql 将范围转换为布尔值

Sql 将范围转换为布尔值,sql,postgresql,Sql,Postgresql,我想要一个像这样的范围 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) A

我想要一个像这样的范围

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。

您可能需要:


它返回的是1,因为您总是将数字本身除以。
max(gs)
没有按照您的想法进行操作,因为您是按
gs
进行分组的

您只需使用
last\u value
窗口函数即可获得所需内容,如下所示:

SELECT
    (gs = last_value(gs) over()) AS result
FROM
    generate_series(1,5) gs;
或者如果您想要最大值(不一定是最后一个-可能是同一个值中的一个):


还有一个窗口函数:
LEAD()
引用下一行,最后一条记录为空



为什么这会颠倒
生成序列的顺序?@NateStemen:如果查询底部没有明确的
order BY
,则查询执行器不保证任何特定的顺序。在本例中,为了窗口的缘故,它将按降序对结果进行排序,然后按原样返回结果(考虑到您没有要求特定的顺序,这是最有效的方法)@wildplasser的答案在这个人为的例子中应该保持升序,但对于任何现实世界的例子,都不应该依赖默认的顺序。是的,你完全正确,顺序并不重要,我只是发现排序时更容易查看数据。感谢您的回答,我不知道
OVER
子句。
last\u value()OVER()
可能适用于这个玩具示例,但一般来说,如果没有明确的窗口顺序,您就不能依赖它(不幸的是,因为
last\u value()
对窗口框架的范围很敏感,您还需要一个
范围
子句)。
最后一个值
是很容易解释的。它将返回结果数据集的最后一个值。OP要求它返回“总是false,除非我们在最后一行。”这正是这样做的-总是,不管最后一行中的值。不一定。它将返回在计算窗口时获取的最后一个值,但这不一定是输出中的最后一行(例如)。虽然OP确实说了“最后一行”,但我认为我们可以安全地推断(从他们试图使用
max()
)来解决这个问题的事实来看),他们的意思是“升序中的最后一行”。显然,如果您添加一个按desc排序的顺序。你猜怎么着?您对您的答案执行相同的操作,得到相同的结果:。所以,我不确定你想在这里展示什么。。。最后,我不知道OP计划如何应用这一点,所以我不尝试假设或推断。在这两种情况下,我都提供了一个替代的
max()over()
。如果你觉得我的答案不对,请投反对票。试图提供OP的解决方案,而不是根据您对问题的解释来捍卫实现的每一个细节。@NateStemen:
last\u value()
也可以给您一个确定的结果,但因为它取决于窗口框架,所以窗口定义有点冗长:
gs=last\u value(gs)(按gs排序的顺序介于无界前后之间)
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;
SELECT (lead(gs) OVER www IS NULL) AS is_last
        FROM generate_series(1,5) gs(gs)
        WINDOW www AS (order by gs)
        ;