【问题标题】: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 和测试大量查询时很有用。特别是当它涉及多次重写某些块时,以这种“删节”的方式进行是非常有帮助的。当然,一旦查询被验证,我们就会将“丑陋”的数字翻译成它们各自的列名。但是,嘿,让我们都假装语法糖不是软件开发的重要组成部分。事实上,我相信这将是一个很棒的功能。

标签: mysql sql google-bigquery


【解决方案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)
猜你喜欢
  • 2013-07-26
  • 1970-01-01
  • 2010-12-02
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
相关资源
最近更新 更多