SQL Self Union Naming? - PullRequest
       7

SQL Self Union Naming?

0 голосов
/ 07 июня 2018

Я немного новичок в SQL, поэтому, пожалуйста, будьте осторожны ...

Я пытаюсь создать [устаревший] самообъединение BigQuery SQL, например:

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

Синтаксис найден в другом ответе SO здесь .Однако запрос 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 и объединения всех, но ни один из них не доступен в BQ Legacy SQL.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

К сожалению, я ограничен устаревшим SQL для нескольких других операций.

Вы можете создать View с именем 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    
0 голосов
/ 07 июня 2018

Во-первых, используйте стандартный 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
...