gpt4 book ai didi

postgresql - Groupwise 选择第 n 行 Postgres

转载 作者:行者123 更新时间:2023-11-29 12:40:40 25 4
gpt4 key购买 nike

我有一个属于“每组最多 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。

最佳答案

使用窗口函数 dense_rankrow_number 就可以了

https://www.postgresql.org/docs/10/static/functions-window.html


解决方案: db<>fiddle

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

现在您必须过滤组号等于组内行号的位置,然后您将获得预期的结果。

关于postgresql - Groupwise 选择第 n 行 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51854132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com