Объединение результатов запроса по количеству записей в одной строке - PullRequest
0 голосов
/ 11 марта 2020

Я новичок в SQL. У меня есть таблица, которая имеет миллиард записей с несколькими столбцами, скажем, a, b, c, d, e, f.

Я хотел бы создать запрос на количество записей для каждого столбца с определенное условие и следующий столбец - это процент этого результата от общего числа записей, затем столбец b, c, d и e с тем же условием. Я хотел бы получить выходные данные моего запроса в одной строке.

Итак, для столбца a запрос, который мне нужен, выглядит примерно так:

select count(a) from table 1
where a >0 and date > '2020-01-01'

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

select count(*) from table 1
where date >'2020-01-01'

Столбец 3 будет результатом этого запроса

select count(b) from table 1
where a >0 and date > '2020-01-01'

столбец 4 будет процентом числа записей столбца b с условием avove относительно общего числа записей

и то же самое для столбца c, d и е.

Ожидаемые результаты будут чем-то как это

количество записей для столбца с условием, процентное отношение a с условием относительно общего количества записей, количество записей для столбца b с условием, процентное отношение b с условием относительно общего количества записей, .... .................

Как правильно написать запрос?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Использовать условное агрегирование:

select
    avg(case 
        when a > 0 and date > '2020-01-01' then 1.0
        when date > '2020-01-01' then 0
    end) avg_a,
    avg(case 
        when b > 0 and date > '2020-01-01' then 1.0
        when date > '2020-01-01' then 0
    end) avg_b
...
from mytable

Это дает вам возможность вычислять метрики в соответствии с различными условиями, включенными в выражение case. Вышеприведенное вычисляет соотношение записей, столбец которых a, b, ... больше 0 и чья дата составляет 2020 или более, по отношению к количеству записей, которые удовлетворяют только условию даты. Другие записи игнорируются.

Обратите внимание, что если условия даты одинаковы для всех case с, вы можете просто переместить их в предложение where, что упрощает логи c:

select
    avg(case when a > 0 then 1.0 else 0 end) avg_a,
    avg(case when b > 0 then 1.0 else 0 end) avg_b
...
from mytable
where '2020-01-01'
0 голосов
/ 11 марта 2020

Просто используйте условную агрегацию. Вот один из методов:

select avg(case when a > 0 then 1.0 else 0 end)
from table 
where date >'2020-01-01'

Или, что немного короче в BigQuery:

select countif(a > 0) / count(*)
from table
where date >'2020-01-01' ;

Вы можете повторить любой из них для остальных столбцов.

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