Postgres Позиция в столбце - PullRequest
4 голосов
/ 15 октября 2011

У меня следующий запрос:

SELECT name, rank() OVER (PARTITION BY user_id ORDER BY love_count DESC) AS position FROM items

И теперь я хотел бы сделать предложение where для функции rank ():

SELECT name, rank() OVER (PARTITION BY user_id ORDER BY love_count DESC) AS position FROM items WHERE position = 1

То есть я хочузапросить наиболее любимый элемент для каждого пользователя.Однако это приводит к:

PGError: ERROR: column "position" does not exist

Кроме того, я использую для этого Rails AREL и хотел бы включить сцепление.Это код Ruby, который создает запрос:

Item.select("name, rank() OVER (PARTITION BY user_id ORDER BY love_count DESC) AS position").where("position = 1")

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 15 октября 2011

Вам нужно «обернуть» его в производную таблицу:

SELECT * 
FROM (
    SELECT name, 
           rank() OVER (PARTITION BY user_id ORDER BY love_count DESC) AS position 
    FROM items
) t
WHERE position = 1
5 голосов
/ 15 октября 2011

Моей первой мыслью было «Использовать общее табличное выражение», как это непроверенное.

WITH badly_named_cte AS (
  SELECT name, 
         rank() OVER (PARTITION BY user_id 
                      ORDER BY love_count DESC) AS position 
  FROM items
)
SELECT * FROM badly_named_cte WHERE position = 1;

Проблема, которую вы видите, связана с логическим порядком оценки, требуемым стандартами SQL.SQL должен действовать так, как будто псевдонимы столбцов (аргументы оператора AS) не существуют, пока после не будет выполнено предложение WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...