【问题标题】:SQL Self Union Naming?SQL 自联合命名?
【发布时间】:2018-11-16 19:44:56
【问题描述】:

我对 SQL 有点陌生,所以请温柔...

我正在尝试创建一个 [legacy] BigQuery SQL 自联合,例如:

SELECT * FROM (query 1), (query 1)

从另一个 SO 答案 here 中找到的语法。但是查询 1 很长,我不想多次复制/粘贴整个查询。有没有办法命名查询 1,这样我就不必重新粘贴整个内容?

我正在尝试执行以下操作(关于对A 的引用):

SELECT 
    * 
FROM 
    (query 1) AS A,
    (SELECT 
        Category as Hier_Level,
        MAX(Department),
        Category,
        "VARIOUS" AS Subcategory,
        SUM(DOLLARS)
     FROM
         A
     GROUPBY
         Category) AS B,
    (SELECT 
        Department as Hier_Level,
        Department,
        "VARIOUS" AS Category,
        "VARIOUS" AS Subcategory,
        SUM(DOLLARS)
     FROM
         A
     GROUPBY
         Department,
         Category) AS C,
    ...

更新

虽然问题的重点是不重复查询 1 的代码,但聚合的最终目标是获取如下数据,由查询 1 输出:

Hier_Level  Department  Category Subcategory  Dollars
Subcategory Electronics TV       LCD          3500
Subcategory Electronics TV       OLED         6000
Subcategory Electronics Phone    iPhone       600

并返回同一个表,其中添加了用于来自 groupbys 的聚合的行。结果应如下所示:

Hier_Level  Department  Category Subcategory  Dollars
Subcategory Electronics TV       LCD          3500
Subcategory Electronics TV       OLED         6000
Subcategory Electronics Phone    iPhone       600
Category    Electronics TV       Various      9500
Category    Electronics Phone    iPhone       600
Department  Electronics Various  Various     10100

在标准 SQL 中,我的理解是可以使用 CTE 和 union all 来完成类似的操作,但在 BQ Legacy SQL 中都没有。

【问题讨论】:

  • 您能否显示确切的查询,或者至少是具有代表性的较小版本?也许它可以用不同的方式重写。旧版 SQL 不支持 CTE,因此消除了一种避免重复查询的好方法。
  • @TimBiegeleisen - 我已经尽可能多地附上了查询 1 的示例 - 这有帮助吗?我知道这有点抽象......
  • @ZaxR - 你应该提供输入数据和预期结果的例子,否则它会在空中拍摄
  • @MikhailBerlyant 不幸的是,我无法分享数据示例。我的最终目标是获取查询 1 并将行添加到该表中,这些行是查询 1 的分组聚合(总和)。各种分组基于一个或多个层次结构级别。这有帮助吗?
  • 没有人对您的具体数据真正感兴趣!只需模仿它并提供一些可以重现您的问题的虚拟数据!

标签: sql google-bigquery union


【解决方案1】:

不幸的是,我仅限于使用旧版 SQL 进行其他一些操作。

您可以创建名为 query1 的视图 - 因此您将其引用为 [project:dataset.query1] - 确保在 Lagacy 模式下创建它,以便您可以在旧模式下从查询中使用它

所以,现在您的查询将完全(几乎)如您所问 - I'm trying to do something like the following (with regards to the references to A)

SELECT * FROM 
  [project:dataset.query1],
  (SELECT 
    'Category' AS Hier_Level,
    MAX(Department) Department,
    Category,
    'Various' AS Subcategory,
    SUM(Dollars) AS Dollars
   FROM [project:dataset.query1]
   GROUP BY Category),
  (SELECT 
    'Department' AS Hier_Level,
    Department,
    'Various' AS Category,
    'Various' AS Subcategory,
    SUM(Dollars) AS Dollars
   FROM [project:dataset.query1]
   GROUP BY Department) 

有你的例子 - 结果将如预期的那样

Row Hier_Level  Department  Category    Subcategory Dollars  
1   Subcategory Electronics TV          LCD          3500    
2   Subcategory Electronics TV          OLED         6000    
3   Subcategory Electronics Phone       iPhone        600    
4   Category    Electronics TV          Various      9500    
5   Category    Electronics Phone       Various       600    
6   Department  Electronics Various     Various     10100    

【讨论】:

  • 谢谢!没有中间视图就无法做到这一点有点令人沮丧,因为查询是从 Python 程序动态创建的,这将导致创建数十个不同的视图 - 许多只会使用一次。我想我将不得不更多地研究如何通过 API 创建和删除视图。
【解决方案2】:

首先,使用标准 SQL,而不是旧版 SQL。

我想我会这样做:

select t.*
from (query) q cross join
     (select 1 union all select 2 union all select 3);

cross join 将每一行乘以第二个select 的次数。

编辑:

不得不使用旧版 SQL 真的很可悲。但是这样的事情应该可以工作:

select q.*
from (<query>) q CROSS JOIN
     (select n
      from (SELECT 1 as n), (SELECT 2 as n), (SELECT 3 as n)
     ) n

【讨论】:

  • 不幸的是,我仅限于使用旧版 SQL 进行其他一些操作。是否有适用于旧版的变体?
  • 感谢您的更新。这不是我要找的。我正在寻找查询 1 并将行添加到该表中,这些行是查询 1 的分组聚合(参见上面的示例) - 我可能只是错过了它,但是我该如何修改上面的内容来完成呢?
猜你喜欢
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
相关资源
最近更新 更多