递增计算联接中不同行的行号 select
Incrementally count row numbers for distrinct rows in a join select
我有一个 select,它通过连接 table、ab
连接两个 table、a
和 b
。
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。
我有一个 select,它通过连接 table、ab
连接两个 table、a
和 b
。
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。