递增计算联接中不同行的行号 select

Incrementally count row numbers for distrinct rows in a join select

我有一个 select,它通过连接 table、ab 连接两个 table、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)

我看过使用 window 函数 row_number(),但这似乎计算了所有行。

我想递增地计算不同的 a 行,而不管加入的 table 创建了多少行。

这在 Postgresql 中可行吗?谢谢。

从table a中选择时使用row_number()(注意,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;

了解 window functions