1

我正在使用 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...

可能吗?

4

1 回答 1

1

尝试将主查询移动到带有 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
于 2013-10-25T19:38:20.270 回答