Применить агрегатную функцию к определенным столбцам, используя SQL в Apache Druid - PullRequest
1 голос
/ 08 мая 2020

У меня есть такая таблица

----------------------
code    sales    goal
----------------------
  b       7       20
  b      12       20
  a       9       15
  c       4        3
  a       4       15

И я хочу выполнить функцию agg для группировки по сумме только в столбце «продажи», потому что столбец «цель» является общим для данного значения в столбец 'code', чтобы получить что-то вроде этого

---------------------------------
code    total    goal
---------------------------------
  b       19      20
  a       13      15
  c        4       3

Есть ли способ выполнить что-то подобное?

SELECT code, SUM(sales) AS total, goal FROM such_table GROUP BY code

Чтобы затем управлять столбцами для выполнения следующих операций в будущем:

------------------------------------------------------
code    sum(sales)   intact(goal)  achvd(100*sum/goal)
------------------------------------------------------
  b         19           20               95
  a         13           15               86.6
  c          4            3              133.3

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Спасибо всем, кто внес свой вклад в этот ответ, я хотел опубликовать решение, которое я использую, читая вас и просматривая веб-страницы.
Учитывая таблицу such_table:

----------------------
code    sales    goal
----------------------
  b       7       20
  b      12       20
  a       9       15
  b       2       20
  c       4        3
  a       4       15

При применении следующий запрос:

SELECT
  code,
  SUM(sales) AS total,
  goal
FROM such_table
GROUP BY code, goal;

Результаты в следующей таблице:

---------------------
code    total    goal
---------------------
  b      19       20
  a      13       15
  c       4        3

Таким образом, для отображения желаемых результатов используется следующий запрос:

SELECT
  code,
  SUM(sales) AS total,
  goal,
  100 * (SUM(sales) / goal) AS prc_of_goal
FROM such_table
GROUP BY code, goal;

Результат в следующем:

-----------------------------------
code    total    goal   prc_of_goal
-----------------------------------
  b      19       20       95
  a      13       15       86.67
  c       4        3      133.33

Это то, что я искал
Всем спасибо
: D

0 голосов
/ 08 мая 2020

Либо включите goal в group by:

SELECT code, SUM(sales) AS total, goal, SUM(sales) * 1.0 / goal as ratio
FROM such_table
GROUP BY code, goal;

Или сделайте его аргументом для функции агрегирования:

SELECT code, SUM(sales) AS total, MAX(goal) as goal,
       SUM(sales) * 1.0 / MAX(goal) as ratio
FROM such_table
GROUP BY code;

Если ваши данные действительно структурированы таким образом , у вас проблема с вашей моделью данных. goal не следует повторять в каждой строке. У вас должна быть одна таблица с одной строкой на code, и эта таблица должна иметь goal. Тогда эта таблица может содержать только продажи.

...