Инкрементный подсчет номеров строк для отдельных строк в выборке объединения
У меня есть выбор, который объединяет две таблицы, a
а также b
через таблицу соединений, ab
,
select a.*, b.*
from a
left join ab on a.id = ab.aid
left join b on b.id = ab.bid;
И это производит
id | athing | id | bthing
----+----------+----+-----------
7 | athing x | 1 | bthing a
7 | athing x | 2 | bthing b
7 | athing x | 3 | bthing c
3 | athing y | 1 | bthing a
(4 rows)
Я хочу столбец, который постепенно подсчитывает количество строк в a
, То есть:
count | id | athing | id | bthing
-------+----+----------+----+-----------
1 | 7 | athing x | 1 | bthing a
1 | 7 | athing x | 2 | bthing b
1 | 7 | athing x | 3 | bthing c
2 | 3 | athing y | 1 | bthing a
(4 rows)
Я смотрел на использование функции окна row_number()
, но это, кажется, считает все строки.
Я хочу постепенно считать различные a
строк, независимо от того, сколько строк создает объединенная таблица.
Это возможно в Postgresql? Спасибо.
1 ответ
Решение
Использование row_number()
при выборе из таблицы a
(обратите внимание, порядок строк в a
определяется в over
пункт):
select a.*, b.*
from (
select row_number() over (order by id desc) as count, *
from a
) a
left join ab on a.id = ab.aid
left join b on b.id = ab.bid;
count | id | athing | id | bthing
-------+----+----------+----+----------
1 | 7 | athing x | 1 | bthing a
1 | 7 | athing x | 2 | bthing b
1 | 7 | athing x | 3 | bthing c
2 | 3 | athing y | 1 | bthing a
(4 rows)
или же dense_rank()
на результате набор данных.
select
dense_rank() over (order by a.id desc) as count,
a.*, b.*
from a
left join ab on a.id = ab.aid
left join b on b.id = ab.bid;
Читайте о оконных функциях.