2016-04-29 2 views
1

Предположим, что есть таблица «элементы», которая имеет три столбца: «id», «pos» и «neg», а результат выбора должен быть упорядочен по результату операции pos - neg.Postgres: Как получить номер строки при заказе по результату операции?

Таким образом, следующее должно работать:

SELECT 
    id, 
    pos - neg AS diff 
FROM items 
ORDER BY diff DESC 

Теперь мне нужно получить позицию конкретной строки (в таблице) приказывать результат на «дифф». Я пробовал это:

WITH summary AS (
    SELECT 
     i.id, 
     i.pos - i.neg AS diff, 
     ROW_NUMBER() OVER(ORDER BY diff) AS position 
    FROM items i) 
SELECT s.* FROM summary s WHERE s.id = 351435254 

но выполнение возвращает ERROR: столбец «diff» не существует.

Итак, можно ли получить позицию, или было бы лучше сохранить разницу в отдельной колонке?

+0

дифф является псевдонимом попробовать 'ROW_NUMBER() OVER (ORDER BY I .pos - i.neg) AS position' вместо –

+0

@ Рихард, который работает! Спасибо! – aspermag

ответ

0

Try:

WITH summary AS (
    SELECT 
     i.id, 
     i.pos - i.neg AS diff, 
     ROW_NUMBER() OVER(ORDER BY (i.pos - i.neg)) AS position 
    FROM items i) 
SELECT s.* FROM summary s WHERE s.id = 351435254 
+0

Это работает, спасибо! Почему-то я даже не думал об этом, потому что на самом деле у меня более сложный расчет, чем «pos-neg» ... – aspermag

1

Чтобы избежать повторения вычислений, просто переместить ROW_NUMBER() на внешний запрос ...

WITH summary AS (
    SELECT 
     i.id, 
     i.pos - i.neg AS diff  
    FROM 
     items i 
) 
SELECT 
    s.*, 
    ROW_NUMBER() OVER(ORDER BY s.diff) AS position 
FROM 
    summary s 
WHERE 
    s.id = 351435254 

Во внутреннем запросе ссылки на diff будет место ограничено что существовало доSELECT, иначе вы можете получить круговые ссылки.

Ко времени внешнего запроса ваше новое поле diff существует, и поэтому могут быть поставлены в качестве параметра для других вычислений, функций и т.д.

+0

Спасибо! Но я забыл сказать, что мне нужна позиция строки внутри всей таблицы, а не выбор ... – aspermag

+0

Такой же подход имеет три уровня вложенного запроса. Внутреннее большинство вычисляет diff, следующий уровень вычисляет позицию, следующий уровень применяет предложение where. Это дорого, однако, всей таблице нужно будет вычислять и сортировать ... – MatBailie

Смежные вопросы