Рабочий запрос Postgres, возвращающий значения, отличные от локального запроса sqlite - PullRequest
0 голосов
/ 03 августа 2010

У меня есть запрос, основанный на ответе на этот вопрос: Обработка связей при ранжировании от самого высокого до самого низкого

Учитывая этот набор данных:

Name | Score
Mike | 5
John | 3
Mary | 3
Matt | 0

Следующий запрос возвращает пользовательский массив, содержащий правильные значения.

User.find_by_sql("SELECT id, score, (SELECT COUNT(DISTINCT outertable.score) + 1
FROM users WHERE score > outertable.score ORDER BY score ASC) AS rank 
FROM users as outertable GROUP BY outertable.id, outertable.score
ORDER BY score DESC LIMIT 30")

Name | Score | Rank
Mike | 5 | 1
John | 3 | 2
Mary | 3 | 2
Matt | 0 | 3

При выполнении точно такого же запроса в Postgres на Heroku я получаю эту ошибку:

ActiveRecord::StatementInvalid: PGError: ERROR:  more than one row returned by a subquery used as an expression

Добавление LIMIT 1 к внутреннему выбору приводит к следующим интересным данным:

Name | Score | Rank
Mike | 5 | nil
John | 3 | 2
Mary | 3 | 2
Matt | 0 | 2

Спасибо за помощь!

1 Ответ

1 голос
/ 03 августа 2010

В вашем SQL есть какая-то проблема. Измените это на:

SELECT  name,score, 
    (SELECT COUNT(DISTINCT score) + 1
     FROM users WHERE score > outertable.score 
     ) AS rank 
FROM users as outertable 
GROUP BY outertable.name, outertable.score
ORDER BY score DESC LIMIT 30

Я попробовал это без проблем! Вы также можете попробовать это утверждение. У них тот же результат.

select a.name,
       a.score,
       count(distinct b.score)+1 as rank
from 
    users a left join users b
    on a.score > b.score
group by
    a.name,a.score
order by a.score desc limit 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...