Инкрементный подсчет номеров строк для отдельных строк в выборке объединения

У меня есть выбор, который объединяет две таблицы, 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;

Читайте о оконных функциях.

Другие вопросы по тегам