我正在使用 postgres 9.1 构建一个分页记分牌。
用户可以根据几个标准对记分板进行排序,他们可以按升序或降序进行排序。有一个功能可以让用户在记分板的多个页面中找到“他们的行”,它必须反映用户选择的排序标准。
我正在使用 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
反映了玩家在我订购的任何标准中的排名。
但是我读过的文档告诉我应该这样做:
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...
可能吗?