SQL 查询 select 每个条件最多 N 条记录
SQL query to select up to N records per criteria
我想知道是否可以使用 SQL(最好是雪花)到 select 最多 N 条记录给定特定条件。
为了显示:
假设我有一个包含 100 万条记录的 table,其中包含全名和 phone 个数字。
可以分配给 X 人的 phone 个号码数量没有限制,但我只想 select 每个人最多 10 个号码,即使这个人有超过10.
请注意,我不想 select 只有 10 条记录,我希望查询 return table 中的每个名称,我只想忽略额外的 [=20] =] 当此人已经拥有 10 个时的数字。
这可以做到吗?
您可以使用 window 函数来解决这个每组最大 n 的问题:
select t.*
from (
select
t.*,
row_number() over(partition by name order by phone_number) rn
from mytable t
) t
where rn <= 10
请注意,您需要一个排序列来定义 "top 10" 的实际含义。我假设 phone_number
,但您可以将其更改为最适合您的用例的值。
更好的是:正如 waldente 评论的那样,snowflake 具有 qualify
语法,这消除了对子查询的需要:
select t.*
from mytable t
qualify row_number() over(partition by name order by phone_number) <= 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;
使用 Snowflake Qualify 函数:
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;
我想知道是否可以使用 SQL(最好是雪花)到 select 最多 N 条记录给定特定条件。 为了显示: 假设我有一个包含 100 万条记录的 table,其中包含全名和 phone 个数字。
可以分配给 X 人的 phone 个号码数量没有限制,但我只想 select 每个人最多 10 个号码,即使这个人有超过10.
请注意,我不想 select 只有 10 条记录,我希望查询 return table 中的每个名称,我只想忽略额外的 [=20] =] 当此人已经拥有 10 个时的数字。
这可以做到吗?
您可以使用 window 函数来解决这个每组最大 n 的问题:
select t.*
from (
select
t.*,
row_number() over(partition by name order by phone_number) rn
from mytable t
) t
where rn <= 10
请注意,您需要一个排序列来定义 "top 10" 的实际含义。我假设 phone_number
,但您可以将其更改为最适合您的用例的值。
更好的是:正如 waldente 评论的那样,snowflake 具有 qualify
语法,这消除了对子查询的需要:
select t.*
from mytable t
qualify row_number() over(partition by name order by phone_number) <= 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;
使用 Snowflake Qualify 函数:
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;