SQL查询,每个条件最多可选择N条记录

SQL查询,每个条件最多可选择N条记录,sql,select,greatest-n-per-group,window-functions,snowflake-cloud-data-platform,Sql,Select,Greatest N Per Group,Window Functions,Snowflake Cloud Data Platform,我想知道,如果给定某些条件,是否可以使用SQL(最好是雪花)来选择多达N条记录。 举例说明: 假设我有一个包含100万条记录的表,其中包含全名和电话号码 可以分配给X个人的电话号码数量没有限制,但我只想每人最多选择10个号码,即使此人的电话号码超过10个 请注意,我不想只选择10条记录,我希望查询返回表中的每个姓名,我只想在此人已经有10个电话号码时忽略额外的电话号码 可以这样做吗?您可以使用窗口函数来解决这一最大的每组n个问题: select t.* from ( select

我想知道,如果给定某些条件,是否可以使用SQL(最好是雪花)来选择多达N条记录。 举例说明: 假设我有一个包含100万条记录的表,其中包含全名和电话号码

可以分配给X个人的电话号码数量没有限制,但我只想每人最多选择10个号码,即使此人的电话号码超过10个

请注意,我不想只选择10条记录,我希望查询返回表中的每个姓名,我只想在此人已经有10个电话号码时忽略额外的电话号码


可以这样做吗?

您可以使用窗口函数来解决这一最大的每组n个问题:

select t.*
from (
    select 
        t.*, 
        row_number() over(partition by name order by phone_number) rn
    from mytable t
) t
where rn <= 10

此查询将有助于满足您的需求:

select 
    full_name,
    phonenumber 
from 
    (select 
        full_name, 
        phonenumber, 
        ROW_NUMBER() over (partition by phonenumber order by  full_name desc) as ROW_NUMBER from sample_tab) a 
where 
    a.row_number between 1 and 10 
order by 
    full_name asc,
    phonenumber desc;
使用雪花限定功能:

select 
    full_name, 
    phonenumber 
from 
    sample_tab qualify row_number() over (partition by phonenumber order by full_name) between 1 and 10 
order by 
    full_name asc ,
    phonenumber desc;

在Snowflake中,可以使用QUALIFY而不是where,并消除子查询
select 
    full_name, 
    phonenumber 
from 
    sample_tab qualify row_number() over (partition by phonenumber order by full_name) between 1 and 10 
order by 
    full_name asc ,
    phonenumber desc;