sql获取组查询中的数据示例

dluptydi  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(397)

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

  1. | name | domain |

我需要sql查询来获取此数据:

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

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

31moq8wy

31moq8wy1#

下面是bigquery标准sql

  1. # standardSQL
  2. SELECT domain, names_count,
  3. samples[OFFSET(0)] AS sample_name_1,
  4. samples[SAFE_OFFSET(1)] AS sample_name_2,
  5. samples[SAFE_OFFSET(2)] AS sample_name_3,
  6. samples[SAFE_OFFSET(3)] AS sample_name_4,
  7. samples[SAFE_OFFSET(4)] AS sample_name_5
  8. FROM (
  9. SELECT domain,
  10. COUNT(name) names_count,
  11. ARRAY_AGG(name ORDER BY RAND() LIMIT 5) samples
  12. FROM `project.dataset.table`
  13. GROUP BY domain
  14. )
展开查看全部
n9vozmp4

n9vozmp42#

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

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

子查询列组 name 他也一样 domain 随机。然后,外部查询按域聚合,并使用条件聚合为每个组带来前5个随机排列的名称。

相关问题