SQL。获取组查询中的数据示例

SQL。获取组查询中的数据示例,sql,random,group-by,google-bigquery,pivot,Sql,Random,Group By,Google Bigquery,Pivot,我有一个只有两列的简单表: | name | domain | 我需要SQL查询来获取此数据: | domain | names count | sample name 1 | ...2 | ...3 | ...4 | ...5 | 因此,第一部分很简单,只需按域分组并计算名称数。但是第二部分,我需要在组中抽取5个姓名样本(可以是随机的)-我不知道如何解决它 您可以使用窗口函数和聚合: select domain, count(*) names_count, max(

我有一个只有两列的简单表:

| name | domain |
我需要SQL查询来获取此数据:

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

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

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

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

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

下面是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
)

请用您正在运行的数据库标记您的问题:mysql、oracle、postgresql…?我正在使用google bigquery。它支持标准的SQL方言。谢谢!即使有2B条记录,这个查询的效果也非常好。