gpt4 book ai didi

ruby-on-rails - row_number() 带有未指定的窗口 `row_number() OVER ()`

转载 作者:行者123 更新时间:2023-11-29 13:32:55 26 4
gpt4 key购买 nike

我正在使用 postgres 9.1 构建分页记分牌。

用户可以根据多个标准对记分板进行排序,他们可以按升序或降序排序。有一个功能可以让用户在记分牌的多个页面中找到“他们的行”,它必须反射(reflect)用户选择的排序标准。

我正在使用 postgres 的 row_number 函数来查找它们在结果集中的偏移量,以返回用户可以找到其行的页面。

我正在阅读的关于 row_number 的所有内容似乎都在暗示坏事 会发生在那些没有在 row_number 窗口内指定顺序的人身上。例如。 row_number() OVER (ORDER BY score_1) 可以,row_number() OVER () 不好

我的案例与我读过的示例不同,因为我明确地对我的查询进行了排序,我意识到如果我不这样做,数据库引擎可能不会以任何特定的顺序返回结果.

但我只想在整个查询级别指定排序并获取结果的 row_number,而不必使用 row_number 的窗口复制我的排序规范。

所以这就是我想做的,而且它“似乎有效”。

SELECT
id,
row_number() OVER () AS player_position,
score_1,
score_2,
score_3,
FROM my_table
ORDER BY (score_1 ASC | score_1 DESC | score_2 ASC | score_2 DESC | score_3 ASC | score_3 DESC)

player_position 反射(reflect)了玩家在我排序时所依据的任何标准中的排名。

但是我读过的文档告诉我应该这样做:

SELECT
id,
row_number() OVER (ORDER BY score_1 ASC) AS player_position,
score_1,
score_2,
score_3,
FROM my_table
ORDER BY score_1 ASC

SELECT
id,
row_number() OVER (ORDER BY score_2 DESC) AS player_position,
score_1,
score_2,
score_3,
FROM my_table
ORDER BY score_2 DESC

我想避免为 row_number 窗口冗余指定顺序的真正原因是为了让我的查询适合 ActiveRecord ORM。我想要我的基本记分牌查询,并按顺序链接。

例如最终,我希望能够做到这一点:

Players.scoreboard.order('score_1 ASC')
Players.scoreboard.order('score_2 DESC')
etc...

这可能吗?

最佳答案

尝试将主查询移动到带有 ORDER BY 的子查询中,并将 ROW_NUMBER() 应用于最外层的查询。

SELECT  y.*,
ROW_NUMBER() OVER () as player_position
FROM
(SELECT
id,
score_1,
score_2,
score_3,
FROM my_table
ORDER BY <whatever>) as y

关于ruby-on-rails - row_number() 带有未指定的窗口 `row_number() OVER ()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19597875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com