我有一个问题属于“每组最大n”类别,但略有不同。我有一张符合以下内容的表格:
| t_id | t_amount | b_id | b_amount |
|------|----------|------|----------|
| 1 | 50 | 7 | 50 |
| 1 | 50 | 15 | 50 |
| 1 | 50 | 80 | 50 |
| 3 | 50 | 7 | 50 |
| 3 | 50 | 15 | 50 |
| 3 | 50 | 80 | 50 |
| 17 | 50 | 7 | 50 |
| 17 | 50 | 15 | 50 |
| 17 | 50 | 80 | 50 |
我想做的基本上是用t_id
划分此表,然后选择第一个分区的第一行,第二个分区的第二行和第三个分区的第三行,结果看起来像这样:
| t_id | t_amount | b_id | b_amount |
|------|----------|------|----------|
| 1 | 50 | 7 | 50 |
| 3 | 50 | 15 | 50 |
| 17 | 50 | 80 | 50 |
似乎是窗口函数或带有distinct on
的东西可能可以解决问题,但我尚未将其组合在一起。
我正在* nix系统上使用Postgres 10。
答案 0 :(得分:3)
使用窗口函数dense_rank
和row_number
可以做到
https://www.postgresql.org/docs/10/static/functions-window.html
SELECT
t_id,
t_amount,
b_id,
b_amount
FROM
(
SELECT
*,
dense_rank() over (ORDER BY t_id) as group_number, -- A
row_number() over (PARTITION BY t_id ORDER BY t_id, b_id)
as row_number_in_group -- B
FROM
test_data) s
WHERE
group_number = row_number_in_group
dense_rank
每给定组(在t_id
上的一个分区)增加一个数字。因此,每个t_id
都有自己的价值。
B row_number
对给定分区内的行进行计数。
我在这里说明子查询的结果:
t_id t_amount b_id b_amount dense_rank row_number
---- -------- ---- -------- ---------- ----------
1 50 7 50 1 1
1 50 15 50 1 2
1 50 80 50 1 3
3 50 7 50 2 1
3 50 15 50 2 2
3 50 80 50 2 3
17 50 7 50 3 1
17 50 15 50 3 2
17 50 80 50 3 3
现在,您必须过滤组号等于组内行号的位置,然后才能得到预期的结果。