在 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 分组后,求每组某列最大?
如何在 T-SQL 中使用 group by 和 union