Проблема с подсчетом отчетливых + случай, когда / с группировкой по группам в BigQuery - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблема с подсчетом + случай, когда / с группировкой по группам в BigQuery. Результат не так, как я ожидал. Вот код:

with tb1 as
(
select 'DN' as geography
       ,'1012658993824' as SKU
       ,1 as pageview

union all

select 'KR' as geography
       ,'1012658993824' as SKU
       ,7 as pageview

)
select geography
       ,count(distinct(case when  pageview between 1 and 5 then SKU end)) as PV_from_0_to_5
       ,count(distinct(case when  pageview between 6 and 10 then SKU end)) as PV_from_6_to_10
from tb1
group by rollup (1)

**Output:**
geography/ PV_from_0_to_5/ PV_from_6_to_10
NULL 1 1
DN 1 0
KR 0 1

**Expected Output**
geography/ PV_from_0_to_5/ PV_from_6_to_10
NULL 0 1
DN 1 0
KR 0 1

Объясните: Очевидно, я считаю количество просмотров одной SKU в двух местах: DN & KR. Проблема в том, что при использовании группировки по группам, я ожидаю, что просмотр страниц будет агрегирован (1 + 7 = 8 просмотров страниц), прежде чем будет подсчитан отдельный номер SKU. Я не могу поставить СУММУ в отдельное количество, поэтому я не знаю, что еще можно сделать.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Я также не вижу ничего плохого в группе по свертке, как говорил Фелипе. Для большей ясности я выполнил этот запрос:

with tb1 as
(
select 'DN' as geography
       ,'1012658993824' as SKU
       ,1 as pageview

union all

select 'KR' as geography
       ,'1012658993825' as SKU
       ,7 as pageview

)
select geography
       ,sum(pageview) as addition
       ,count(pageview) as count
       ,count(distinct(case when  pageview between 1 and 5 then SKU end)) as PV_from_0_to_5
       ,count(distinct(case when  pageview between 6 and 10 then SKU end)) as PV_from_6_to_10
       , ARRAY_AGG(case when  pageview between 1 and 5 then SKU end IGNORE NULLS) PV_from_0_to_5_agg
       , ARRAY_AGG(case when  pageview between 6 and 10 then SKU end IGNORE NULLS) PV_from_6_to_10_agg

from tb1
group by rollup (geography)

Вы увидите, что вы получили дополнение 8 и счет 2 для первой строки. Это означает, что на самом деле у вас есть и просмотр страниц 1 и просмотр страниц 7. Следовательно, вы получите ожидаемый результат.

Если вы хотите получить запрошенный результат, вам нужно явно использовать сумму просмотров страниц. То есть:

with tb1 as
(
select 'DN' as geography
       ,'1012658993824' as SKU
       ,1 as pageview

union all

select 'KR' as geography
       ,'1012658993825' as SKU
       ,7 as pageview

)
select geography,sum(pageview) as addition
       ,CAST(sum(pageview)<5 AND sum(pageview)>0 AS INT64) as PV_from_0_to_5
       ,CAST(sum(pageview)>5 AND sum(pageview)<10 AS INT64) as PV_from_6_to_10

from tb1
group by rollup (geography)

0 голосов
/ 03 апреля 2020

Я не вижу ничего плохого в этом GROUP BY ROLLUP.

Вы можете использовать ARRAY_AGG(), чтобы увидеть, что подсчитывается:

with tb1 as
(
select 'DN' as geography
       ,'1012658993824' as SKU
       ,1 as pageview

union all

select 'KR' as geography
       ,'1012658993824' as SKU
       ,7 as pageview

)
select geography
       ,count(distinct(case when  pageview between 1 and 5 then SKU end)) as PV_from_0_to_5
       ,count(distinct(case when  pageview between 6 and 10 then SKU end)) as PV_from_6_to_10
       , ARRAY_AGG(case when  pageview between 1 and 5 then SKU end IGNORE NULLS) PV_from_0_to_5_agg
       , ARRAY_AGG(case when  pageview between 6 and 10 then SKU end IGNORE NULLS) PV_from_6_to_10_agg
from tb1
group by rollup (geography)

enter image description here

В примере запроса используется один и тот же идентификатор для двух разных строк.

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