Возвращает номер строки в postgresql

63
7

У меня есть место, где я храню orderrows (salesrow_id), поэтому одна строка счета-фактуры, которая является частью порядка order_id и цены, уплаченной за этот товар

salesrow_id(pk) | order_id | price | name
10 1 5 spaghetti
11 1 4 pizza
12 2 6 salami
13 1 1 vegetables

То, чего я пытаюсь добиться, - это получить точное число в счете, используя order_id и salesrow_id. Например: salesrow_id = 13, order_id = 1 должен вернуть 3, так как это третий элемент в моем счете за заказ 1, если он отсортирован по salesrow_id.

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

Может ли кто-то подтолкнуть меня в правильном направлении?

спросил(а) 2021-01-25T16:13:22+03:00 4 месяца, 4 недели назад
1
Решение
63

Вы ищете row_number(), я думаю:

select t.*,
row_number() over (partition by order_id order by sales_row_id) as rownumber
from t;

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

select t.*
from (select t.*,
row_number() over (partition by order_id order by sales_row_id) as rownumber
from t
) t
where sales_row_id = 13;

Если вы заботитесь о производительности, коррелированный подзапрос может быть лучше:

select t.*,
(select count(*)
from t t2
where t2.order_id = t.order_id and t2.sales_row_id <= t.sales_row_id
) as rownum
from t
where t.sales_row_id = 13;

Обратите внимание, что row_number() (в первом запросе) лучше всего подходит для назначения результатов всей таблице. Коррелированный подзапрос будет иметь лучшую производительность только при выборе одной строки или небольшого количества строк.

ответил(а) 2021-01-25T16:13:22+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема