Как я должен обработать “оцениваемый x из y” данные в PostgreSQL?

На сайте первая вещь Вы читали бы когда начало работы списки все Ваши текущие опции. Существует netbeans дополнение , emacs режим и синтаксис энергии выделение.

6
задан Carl Meyer 23 September 2009 в 16:46
поделиться

4 ответа

Если вам нужен ранг, сделайте что-нибудь вроде

SELECT id,num,rank FROM (
  SELECT id,num,rank() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

Или, если вам действительно нужен номер строки, используйте

SELECT id,num,row_number FROM (
  SELECT id,num,row_number() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

Они будут отличаться, если у вас где-то будут одинаковые значения. Если вам это нужно, есть также elastic_rank ().

Для этого, конечно же, требуется PostgreSQL 8.4.

7
ответ дан 8 December 2019 в 14:45
поделиться

Разве это не так:

SELECT  *
FROM    mytable
ORDER BY
        col1
OFFSET X LIMIT 1

Или мне что-то не хватает?

Обновление:

Если вы хотите показать ранг, используйте это:

SELECT  mi.*, values[1] AS rank, values[2] AS total
FROM    (
        SELECT  (
                SELECT  ARRAY[SUM(((mi.col1, mi.ctid) < (mo.col1, mo.ctid))::INTEGER), COUNT(*)]
                FROM    mytable mi
                ) AS values
        FROM    mytable mo
        WHERE   mo.id = @myid
        ) q
5
ответ дан 8 December 2019 в 14:45
поделиться

Предыдущие ответы решают вопрос «выберите все строки и получите их рейтинг», который вам не подходит хотите ...

  • у вас есть строка
  • , вы хотите узнать ее рейтинг

Просто выполните:

SELECT count (*) FROM table WHERE score> $ 1

Где $ 1 - это оценка строка, которую вы только что выбрали (я полагаю, вы хотите отобразить ее, чтобы вы могли ее выбрать ...).

Или выполните:

SELECT a. , (SELECT count () FROM table b WHERE score> b.score) AS rank FROM table AS a WHERE pk = ...

Однако , если вы выберете строку, которая ранжируется последней, да, вам нужно будет подсчитать все строки, ранжированные перед ней, Кого волнуют проигравшие?

Хорошо, если вы действительно заботитесь о проигравших, вам нужно будет построить гистограмму:

Предположим, оценка может идти от 0 до 100, и у вас есть 1000000 проигравших со счетом <80 и 10 победителей со счетом> 80.

Вы составляете гистограмму того, сколько строк имеют оценку X, это простая небольшая таблица со 100 строками. Добавьте триггер в свою основную таблицу для обновления гистограммы.

Теперь, если вы хотите ранжировать проигравшего, у которого есть оценка X, его ранг равен сумме (гисто), где histo_score> X.

Поскольку ваш результат, вероятно, не между 0 и 100, но (скажем) между 0 и 1000000000, вам нужно немного подправить его, например, увеличить ячейки гистограммы. так что вам нужно не более 100 ячеек или использовать какую-нибудь функцию распределения лог-гистограмм.

Кстати, postgres делает это, когда вы АНАЛИЗИРУете таблицу,

1
ответ дан 8 December 2019 в 14:45
поделиться

ROW_NUMBER функциональность в PostgreSQL реализуется через LIMIT n OFFSET skip .

РЕДАКТИРОВАТЬ: Поскольку вы запрашиваете ROW_NUMBER () вместо простого ранжирования: row_number ( ) представлен в PostgreSQL в версии 8.4. Так что вы можете подумать об обновлении. В противном случае этот обходной путь может оказаться полезным.

3
ответ дан 8 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: