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

问题描述 投票:2回答:2

我想知道是否有可能使用SQL(最好是雪花)在给定特定条件下最多选择N条记录。为了显示:可以说我有一个包含100万条记录的表,其中包含全名和电话号码。

可以分配给X个人的电话号码数量没有限制,但是即使该人的电话号码超过10个,我也只希望选择最多10个电话号码。

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

可以这样做吗?

sql greatest-n-per-group snowflake-cloud-data-platform
2个回答
4
投票

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

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

请注意,您需要一个排序列来定义“前10名”的实际含义。我假设为phone_number,但是您可以将其更改为最适合您的用例的方式。

更好:如waldente所评论,雪花具有qualify语法,从而无需使用子查询:

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

2
投票

此查询将帮助您满足要求:

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;
© www.soinside.com 2019 - 2024. All rights reserved.