【问题标题】:SQL. Get samples of data in group querySQL。获取分组查询中的数据样本
【发布时间】:2020-09-06 06:55:03
【问题描述】:

我有一个只有 2 列的简单表格:

| name | domain |

我需要一个 SQL 查询来获取这些数据:

| domain | names count | sample name 1 | ...2 | ...3 | ...4 | ...5 |

所以,第一部分很简单,只是按域分组并计算名称。但是第二部分,我需要在组中抽取 5 个样本(它们可以是随机的) - 我不知道如何解决它。

【问题讨论】:

  • 请用您正在运行的数据库标记您的问题:mysql、oracle、postgresql...?
  • 我正在使用谷歌大查询。它支持标准的 SQL 方言。

标签: sql random group-by google-bigquery pivot


【解决方案1】:

您可以使用窗口函数和聚合:

select
    domain,
    count(*) names_count,
    max(case when rn = 1 then name end) sample_name_1,
    max(case when rn = 2 then name end) sample_name_2,
    max(case when rn = 3 then name end) sample_name_3,
    max(case when rn = 4 then name end) sample_name_4,
    max(case when rn = 5 then name end) sample_name_5
from (
    select t.*, row_number() over(partition by domaine order by rand()) rn
    from mytable t
) t
group by domain

子查询随机排列具有相同domainnames。然后,外部查询按域聚合,并使用条件聚合将前 5 个随机排名的名称带到每组中。

【讨论】:

    【解决方案2】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT domain, names_count,
      samples[OFFSET(0)] AS sample_name_1,
      samples[SAFE_OFFSET(1)] AS sample_name_2,
      samples[SAFE_OFFSET(2)] AS sample_name_3,
      samples[SAFE_OFFSET(3)] AS sample_name_4,
      samples[SAFE_OFFSET(4)] AS sample_name_5
    FROM (
      SELECT domain, 
        COUNT(name) names_count,
        ARRAY_AGG(name ORDER BY RAND() LIMIT 5) samples
      FROM `project.dataset.table`
      GROUP BY domain
    )
    

    【讨论】:

    • 谢谢!即使使用 2B 条记录,此查询也能正常工作。
    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多