Пошаговый подсчет номеров строк для distrint строк в соединении select

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


person mmm111mmm    schedule 17.07.2016    source источник


Ответы (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;

Прочтите об оконных функциях.

person klin    schedule 17.07.2016