在 SQL 中使用 group by 列 1、2、3、...、n 是不是有任何语法糖?

Posted

技术标签:

【中文标题】在 SQL 中使用 group by 列 1、2、3、...、n 是不是有任何语法糖?【英文标题】:Is there any syntactic sugar to using group by columns 1,2,3,...,n in SQL?在 SQL 中使用 group by 列 1、2、3、...、n 是否有任何语法糖? 【发布时间】:2021-06-06 13:01:08 【问题描述】:

我知道这不是“做事的好方法”,但我们在许多 SQL 查询中使用以下符号:

SELECT dim_1,dim_2,...,dim_n,agg_function(metric_1),...agg_function(metric_k)
FROM table
GROUP BY 1,2,...,n

我想知道是否有更简洁的写法,例如GROUP BY 1-n(按 col_1 到 col_n 分组)

【问题讨论】:

仅使用您正在使用的数据库标记您的问题。不管怎样,答案基本上都是“不”。 我同时使用两个数据库 @Strawberry,这些东西在 ELT 环境中进行 POC 和测试大量查询时很有用。特别是当它涉及多次重写某些块时,以这种“删节”的方式进行是非常有帮助的。当然,一旦查询被验证,我们就会将“丑陋”的数字翻译成它们各自的列名。但是,嘿,让我们都假装语法糖不是软件开发的重要组成部分。事实上,我相信这将是一个很棒的功能。 【参考方案1】:

假设您有一个包含十几列或更多列的表格

考虑下面的 BigQuery 模板(注意下面的 offset 是从零开始的) - 应该非常适合您提到的 POC 类型的工作

select (
    select string_agg(kv)
    from unnest(split(trim(to_json_string(t), ''))) kv with offset 
    where offset between 0 and N-1
  ) dims,
  agg_function(metric_1),...agg_function(metric_k)
from `project.dataset.table` t
group by 1      

以下是虚拟/简单示例

with `project.dataset.table` as (
  select 1 col1, '2' col2, 3 col3, 4 col4 union all 
  select 11, '2', 3, 41
)
select 
  (
    select string_agg(kv)
    from unnest(split(trim(to_json_string(t), ''))) kv with offset 
    where offset in (1,2)
  ) dims,
  sum(col1) metric1, count(col1) metric2
from `project.dataset.table` t
group by 1 

有输出

【讨论】:

如果我们以键、值格式聚合维度,您如何过滤维度? 感谢您抽出宝贵时间@MikhailBerlyant,虽然这是将所有维度放在一起的巧妙方法,但与我所要求的不同。我感谢您的努力。 你要求... any syntactic sugar ... - 我给了你选择!显然它不只是group by 1-N,因为它不存在,而我的答案中的解决方法可以让你避免一英里长的SELECT dim_1,dim_2,...,dim_n,,更短但仍然很长GROUP BY 1,2,...,n!所以我认为我的回答完全回答了你的问题:o)

以上是关于在 SQL 中使用 group by 列 1、2、3、...、n 是不是有任何语法糖?的主要内容,如果未能解决你的问题,请参考以下文章

在 group by 中,有没有办法告诉 SQL 特定列不需要聚合函数?

sql中group by 是啥意思啊?请教谢谢

sql语言 怎么求每组最大,就是用group by 分组后,求每组某列最大?

如何在 T-SQL 中使用 group by 和 union

mysql GROUP BY、DISTINCT、ORDER BY语句优化

sql语句中的group by啥意思