Функция группировки SQL с большим количеством столбцов - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь понять SQL, написанный коллегой, и пытаюсь понять, как работает функция GROUPING () в этом случае. Почему значение date_level_year_quarter_month равно 3 и 7 в последних двух строках? Заранее спасибо!

SELECT
    t_year,
    t_quarter,
    t_month,
    GROUPING(t_year, t_quarter, t_month) date_level_year_quarter_month
FROM
    d_time
WHERE t_year IN (2016)
GROUP BY
ROLLUP(t_year, t_quarter, t_month)
ORDER BY 1, 2, 3;

+---------+------------+------------+-------------------------------+
| t_year  |  t_quarter |  t_month   | date_level_year_quarter_month |
+---------+------------+------------+-------------------------------+
| 2016    |      1     |      1     |               0               |
+---------+------------+------------+-------------------------------+
| 2016    |      1     |      2     |               0               |
+---------+------------+------------+-------------------------------+
| 2016    |      1     |      3     |               0               |
+---------+------------+------------+-------------------------------+
| 2016    |      1     |            |               1               |
+---------+------------+------------+-------------------------------+
| 2016    |    ...     |     ...    |              ...              |
+---------+------------+------------+-------------------------------+
| 2016    |            |            |               3               |
+---------+------------+------------+-------------------------------+
|         |            |            |               7               |
+---------+------------+------------+-------------------------------+

EDIT: Похоже, что для каждого «добавленного» измерения значение функции GROUPING в два раза превышает значение «предыдущей группировки» + 1, однако мне все еще неясно, как функция рассчитывает эти значения в первую очередь.

SELECT 
      T_YEAR
    , T_QUARTAL
    , T_MONTH
    , T_WEEK
    , T_DATE
    , GROUPING (T_YEAR ) AS LEVEL_YEAR
    , GROUPING (T_YEAR, T_QUARTER) AS LEVEL_YEAR_QUARTAL
    , GROUPING (T_YEAR, T_QUARTER, T_MONTH) AS LEVEL_YEAR_QUARTAL_MONTH
    , GROUPING (T_YEAR, T_QUARTER, T_MONTH, T_WEEK) AS LEVEL_YEAR_QUARTAL_MONTH_WEEK
    , GROUPING (T_YEAR, T_QUARTER, T_MONTH, T_WEEK, T_DAY) AS LEVEL_YEAR_QUARTAL_MONTH_WEEK_DAY
FROM D_TIME
WHERE T_YEAR=2016 AND T_WEEK = 1
GROUP BY
ROLLUP (T_YEAR, T_QUARTER, T_MONTH, T_WEEK, T_DAY) 
ORDER BY 5,1,2,3,4;

Grouping output:

1 Ответ

0 голосов
/ 03 мая 2018

Я нашел ответ в Документация Exasol .

"В случае нескольких аргументов значением результата является число, двоичное представление которого похоже на

GROUPING(arg1), GROUPING(arg2),..., GROUPING(argn). 

например. верно следующее:

GROUPING(a,b,c) = 4xGROUPING(a) + 2xGROUPING(b) + 1xGROUPING(c)."
...