如何用group by查询group by?

Posted

技术标签:

【中文标题】如何用group by查询group by?【英文标题】:how to query group by with group by? 【发布时间】:2021-01-19 06:53:55 【问题描述】:

我的桌子:

bucket  | bytes  | url   
-----
a       | 111     | url_1   
a       | 222     | url_1  
a       | 222     | url_2
a       | 222     | url_3
a       | 222     | url_4
a       | 222     | url_5
a       | 222     | url_6
a       | 222     | url_7
a       | 222     | url_8
a       | 222     | url_9
a       | 222     | url_10
a       | 222     | url_11
b       | 444     | url_4
b       | 555     | url_4
c       | 444     | url_5

我要查询:

    按桶分组,如select bucket from table group by bucket。 对于每个存储桶,按 url 分组,例如 select sum(bytes) from table where bucket = <every_one_bucket_in_the_group_by> group by url order by sum(bytes) desc limit 10。对于每个存储桶,它最多有 10 个结果行。

如何组合这两个子查询?

结果应该是这样的:

bucket   |   url   |  sum_bytes
----
a        | url_1   |  333
a        | url_2   |  222
a        | url_3   |  222
a        | url_4   |  222
a        | url_5   |  222
a        | url_6   |  222
a        | url_7   |  222
a        | url_8   |  222
a        | url_9   |  222
a        | url_10  |  222
b        | url_4   |  999
c        | url_5   |  444

【问题讨论】:

分享您的最终输出样本 【参考方案1】:

你需要使用limit by-clause:

select bucket, url, sum(bytes) sum_bytes
from (
  /* emulate test dataset */
  select data.1 bucket, data.2 bytes, data.3 url
  from (
    select arrayJoin([
      ('a', 111, 'url_01'),   
      ('a', 222, 'url_01'),  
      ('a', 222, 'url_02'),
      ('a', 222, 'url_03'),
      ('a', 222, 'url_04'),
      ('a', 222, 'url_05'),
      ('a', 222, 'url_06'),
      ('a', 222, 'url_07'),
      ('a', 222, 'url_08'),
      ('a', 222, 'url_09'),
      ('a', 222, 'url_10'),
      ('a', 222, 'url_11'),
      ('b', 444, 'url_04'),
      ('b', 555, 'url_04'),
      ('c', 444, 'url_05')]) data)
  )
group by bucket, url
order by bucket, url
limit 10 by bucket

/*
┌─bucket─┬─url────┬─sum_bytes─┐
│ a      │ url_01 │       333 │
│ a      │ url_02 │       222 │
│ a      │ url_03 │       222 │
│ a      │ url_04 │       222 │
│ a      │ url_05 │       222 │
│ a      │ url_06 │       222 │
│ a      │ url_07 │       222 │
│ a      │ url_08 │       222 │
│ a      │ url_09 │       222 │
│ a      │ url_10 │       222 │
│ b      │ url_04 │       999 │
│ c      │ url_05 │       444 │
└────────┴────────┴───────────┘
*/

【讨论】:

感谢您的回答,我想在按桶和 url 分组后按 sum_bytes 排序,所以我像 select bucket, url, sum(bytes) as sum_bytes from table group by bucket, url order by sum_bytes limit 10 by bucket 一样查询。对吗?【参考方案2】:

你在下面找到一个

select bucket,url,sum(bytes) as sumbyte from table 
group by bucket,url
order by sumbyte desc

【讨论】:

其中bucket = @Rife 所以分享你的实际情况和实际需要什么......人们如何读懂你的想法 感谢您的回答。子查询还有一个条件:limit 10.

以上是关于如何用group by查询group by?的主要内容,如果未能解决你的问题,请参考以下文章

ElasticsearchElasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

如何用group by提取包含数据

如何用 seaborn 绘制 pandas 三列(用 group by 计算)

如何用sql server中的group by和where显示数据?

使用 group by 和 MAX 函数的 Pig Latin 查询

如何使用group by 分组查询表中所有字段信息