【问题标题】:SQL query to select up to N records per criteriaSQL 查询,每个条件最多选择 N 条记录
【发布时间】:2020-06-21 12:23:06
【问题描述】:

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

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

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

这个可以吗?

【问题讨论】:

    标签: sql select greatest-n-per-group window-functions snowflake-cloud-data-platform


    【解决方案1】:

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

    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
    

    【讨论】:

    • 在 Snowflake 中,您可以使用 QUALIFY 代替 where,并消除子查询
    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多