首页 > 解决方案 > 在不使用连接的情况下为每个组获取 N 个结果

问题描述

我可以在不使用连接的情况下解决这个问题吗?这张表的数据太多了,我想更高效地完成它。我的想法之一是使用group_concat子查询获取ID列表,但它不适用于IN子句。

SELECT * FROM table WHERE id IN (group_concat subquery)

我可以听听你的建议吗?

data
    ID SERVER_ID ...
    --------------------
    1  1  ...
    2  1
    3  1
    4  2
    5  2
    6  2
    7  3
    8  3
    9  3
    10 3
    ...



expected result with limit 2 per each group: 
    ID SERVER_ID ...
    --------------------
    1  1  ...
    2  1
    4  2
    5  2
    7  3
    8  3

标签: sql

解决方案


您可以尝试以下使用row_number,此解决方案适用于 postgreSQL、MySQL 8.0、Oracle 和 SQL Server。

select
    id,
    server_id
from
(
    select
        id,
        server_id,
        row_number() over (partition by server_id order by id) as rnk
    from yourTable
) val
where rnk <= 2

这是演示

| id  | server_id |
| --- | --------- |
| 1   | 1         |
| 2   | 1         |
| 4   | 2         |
| 5   | 2         |
| 7   | 3         |
| 8   | 3         |

推荐阅读