2015-11-20 4 views
0

У меня есть таблица с четырьмя колоннами, глядя, как это:запросов различны в Google BigQuery

id,name, key, date 
1,'A' ,'x1','2015-11-11' 
2,'A' ,'x1','2015-11-11' 
3,'B' ,'x2','2015-11-11' 
4,'B' ,'x2','2015-11-11' 
5,'A' ,'x1','2015-11-12' 
6,'A' ,'x1','2015-11-12' 
7,'B' ,'x2','2015-11-12' 
8,'B' ,'x2','2015-11-12' 
9,'D' ,'x3','2015-11-12' 
10,'A' ,'x1','2015-12-11' 
11,'A' ,'x1','2015-12-11' 
12,'B' ,'x2','2015-12-11' 
13,'B' ,'x2','2015-12-11' 
14,'A' ,'x1','2015-12-12' 
15,'A' ,'x1','2015-12-12' 
16,'B' ,'x2','2015-12-12' 
17,'B' ,'x2','2015-12-12' 
18,'D' ,'x3','2015-12-12' 

Я хочу, чтобы подсчитать число различных новыхkey -s для каждого date:

2015-11-11 2      -- (two distinct keys: x1 and x2) 
2015-11-12 1      -- (one new key: x3) 
2015-12-11 2      -- (two distinct keys: x1 and x2) - (different month 11) 
2015-12-12 1      -- (one new key: x3) - (different month 11) 

Только в каждом месяце.

Как это сделать?

ответ

1

это точно так, как в вас предыдущий вопрос (ы) - нужно просто добавить дополнительную группу/раздел по месяцам -> см использование поля годМесяц

SELECT DATE, EXACT_COUNT_DISTINCT(key) AS keys 
FROM (
    SELECT DATE, key, LEAD(DATE) OVER(PARTITION BY key, YearMonth ORDER BY DATE DESC) AS new 
    FROM (SELECT DATE, LEFT(DATE, 7) AS YearMonth, key FROM YourTable GROUP BY 1, 2, 3) 
) WHERE new IS NULL 
GROUP BY DATE 
ORDER BY DATE 
+0

О, спасибо, сэр. Я думаю, что с PARTITION мы устанавливаем только одно поле. –

+0

Вы можете помочь мне с новым запросом? http://stackoverflow.com/questions/34010839/how-to-mapping-2-table-condition-the-first-day –

0

Вот как я пытался ее решить:

  1. Extract месяц с даты:

    выбора ключа, дата, regexp_extract (дата, г '[\ d] + - (\ d \ d) - \ d \ d ') месяц от т

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

    выберите дату, месяц, счет (отдельный ключ) over (разделение по месяцам по дате строки между неограниченной предшествующей и текущей строкой) cd от (выберите ключ, дату, regexp_extract (date, r '[\ d] + - (\ d \ d) - \ d \ d ') месяц от т)

  3. Выберите общее distincts подсчета в месяц

    выберите дату, месяц максимум (CD) CD из ( выберите даты, месяца, count (отдельный ключ) over (разделение по месяцам по дате строки между неограниченной предшествующей и текущей строкой) cd от (выберите ключ, date, regexp_extract (date, r '[\ d] + - (\ d \ d) - \ d \ d ') месяц от t)) группа по 1, 2

  4. Для каждой даты вычислительному подсчета общего числа уникальных ключей, с начала месяца на предыдущую дату:

    выберите дату, компакт-диск, лаг (кд, 1) в течение (раздел по месяцам порядке по дате) prev_cd из ( выберите дату, месяц, макс (cd) cd из ( выберите дату, месяц, счет (отдельный ключ) над (разбиение по месяцам по дате строки между неограниченной предшествующей и текущей строкой) cd из (выберите ключ, дату, regexp_extract (дата, r '[\ d] + - (\ d \ d) - \ d \ d') месяц с t)) группа по 1, 2)

  5. Вычесть предыдущую дату с текущей - это ответ :

    выберите дату, кд - prev_cd из ( выберите дату, кд, лаг (кд, 1) в течение (раздел по месяцам порядке по дате) prev_cd из ( выберите дату, месяц, не более (CD) CD из ( выберите дату, месяц, счетчик (отдельный ключ) (разбиение по месяцам по дате строки между неограниченной предшествующей и текущей строкой) cd из (выберите ключ, дату, regexp_extract (date, r '[\ d] + - (\ d \ d) - \ d \ d ') месяца от moshap.WD)) группа 1, 2))

Смежные вопросы