Postgres: Найти позицию определенной строки в наборе результатов? - PullRequest
15 голосов
/ 05 сентября 2010

Я пытаюсь выяснить, как получить относительную позицию отдельного элемента в запросе относительно всех элементов, возвращаемых из запроса.

Например, длинный способ получить ответ будет:

single_item = SELECT * FROM table WHERE id=65
result = SELECT * FROM table WHERE published_date < date_value
x=1
foreach(result as item):
    if(item.id == single_item.id):
        required_value = x
    endif
    x++
endforeach

Есть ли простой способ получить required_value только через один запрос postgres?

1 Ответ

28 голосов
/ 05 сентября 2010

Использование аналитических / ранжирующих / оконных функций - ссылка на документацию 8.4 :

WITH summary AS (
   SELECT t.*,
          ROW_NUMBER() OVER(ORDER BY t.published_date) AS position
     FROM TABLE t)
SELECT s.*
  FROM summary s
 WHERE s.id = 65

Альтернатива без синтаксиса WITH:

SELECT s.*
  FROM (SELECT t.*,
               ROW_NUMBER() OVER(ORDER BY t.published_date) AS position
          FROM TABLE t) s
 WHERE s.id = 65

Столбец position будет целочисленным значением, представляющим местоположение записи, где значение id равно 65, на основе столбца published_date в порядке возрастания. Если вы хотите, чтобы значение позиции дублировалось при наличии связей, замените ROW_NUMBER() на RANK()

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