Соотношение SQL между строками

#sql #sql-server #apache-drill

#sql #sql-сервер #apache-детализация

Вопрос:

У меня есть таблица SQL со следующим форматом:

  ------------------------------------ 
| function_id | event_type | counter |
 ------------- ------------ --------- 
| 1           | fail       | 1000    |
| 1           | started    | 5000    |
| 2           | fail       | 800     |
| 2           | started    | 4500    |
| ...         | ...        | ...     |
 ------------- ------------ --------- 
 

Я хочу запустить запрос по этому, который сгруппирует результаты по function_id, указав соотношение количества событий «сбой» и количества событий «запуск», а также поддерживая количество сбоев. Т.е. Я хочу выполнить запрос, который даст что-то, чтовыглядит следующим образом:

  ------------------------------------- 
| function_id | fail_ratio | failures |
 ------------- ------------ ---------- 
| 1           | 20%        | 1000     |
| 2           | 17.78%     | 800      |
| ...         | ...        |          |
 ------------- ------------ ---------- 
 

Я пробовал несколько подходов, но пока безуспешно. В данный момент я использую Apache Drill SQL, поскольку эти данные извлекаются из плоских файлов.

Буду признателен за любую помощь! 🙂

Ответ №1:

Это все условная агрегация:

 select function_id,
       sum(case when event_type = 'fail' then counter*1.0 end) / sum(case when event_type = 'started' then counter end) as fail_start_ratio,
       sum(case when event_type = 'fail' then counter end) as failures
from t
group by function_id
 

Комментарии:

1. Большое спасибо, это отлично сработало! Мне просто нужно было быстро изменить это, чтобы привести подсчеты к значению с плавающей запятой, например: выберите function_id, 100.0 * приведение (сумма (случай, когда event_type = ‘fail’, затем конец счетчика) как float) / приведение (сумма (случай, когда event_type = ‘started’, затем конец счетчика) какfloat) как fail_start_ratio, sum (случай, когда event_type = ‘fail’, затем конец счетчика) как сбои из группы t по function_id

2. Извините, это получилось странно отформатировано: ( выберите function_id, 100.0 * приведение (сумма (случай, когда event_type = ‘fail’, затем конец счетчика) как с плавающей точкой) / приведение (сумма (случай, когда event_type = ‘started’, затем конец счетчика) как с плавающей точкой) как fail_start_ratio, сумма (случай, когда event_type = ‘сбой ‘затем конец счетчика) как сбои из группы t по function_id

3. select function_id, ` 100.0 * приведение (sum(случай, когда event_type = ‘fail’, затем конец счетчика) как с плавающей точкой) / приведение (sum (случай, когда event_type = ‘started’, затем конец счетчика) как с плавающей точкой) как fail_start_ratio, sum(случай, когда event_type = ‘fail’, затем конец счетчика) как сбои из tгруппировать по function_id