Эффективный способ суммирования в одном столбце, где количество (значение_1) / количество (значение_2) другого столбца больше, чем х - PullRequest
0 голосов
/ 31 марта 2020

У меня есть таблица следующей структуры:

| id | bool | amt |
-------------------
| 1  | 0    | 4   |
| 1  | 1    | 3   |
| 1  | 1    | 5   |
| 2  | 0    | 8   |
| 2  | 1    | 4   |
| 2  | 0    | 4   |

Я хочу получить сумму amt, но только при соотношении bool = 1 / bool = 0 на id больше 0,6.

Я успешно сделал это следующим образом:

SELECT SUM(amt) as total_amt,
FROM table
WHERE id IN (
    SELECT id 
    FROM table 
    GROUP BY id 
    HAVING CAST(SUM(bool) AS DOUBLE) / CAST(COUNT(bool) AS DOUBLE) > 0.6
)

Однако моя проблема в том, что это игрушечная симуляция моих реальных таблиц и данных, и на самом деле это это очень большой объем данных. Когда я запускаю этот запрос для всех своих данных, я получаю сообщения об ошибках, говорящих о том, что предел памяти кластера достигнут, или что время выполнения достигло предела. Если я удаляю оператор WHERE, который находит id s, удовлетворяющие отношению, то он выполняется без ошибок.

Прежде чем прибегнуть к увеличению этих пределов, есть ли способ, которым я могу добиться этого более эффективно, или с точки зрения памяти, времени выполнения или обоих?

1 Ответ

0 голосов
/ 31 марта 2020

Вы можете использовать два уровня агрегации:

select sum(id_amount)
from (select id, sum(amount) as id_amount,
             avg(case when bool then 1.0 else 0 end) as ratio
      from t
      group by id
     ) t
where ratio > 0.6;

Примечание: у меня мало опыта работы с Presto. Я думаю, что вы можете использовать:

avg(bool)

или:

avg(bool::int)

вместо приведенного выше выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...