BigQuery - считать условно - PullRequest
       8

BigQuery - считать условно

0 голосов
/ 15 января 2019

Я хочу посчитать количество вхождений, которые существуют перед строкой.

Таблица:

|day |time|type|1   |2   |3   |4   |
|Mon |9   |A   |a1  |a2  |a3  |a4  |
|Mon |10  |B   |b1  |b2  |b3  |b4  |
|Mon |12  |A   |c1  |c2  |c3  |c4  |
|Mon |20  |C   |d1  |d2  |d3  |d4  |
|Tue |9   |A   |e1  |e2  |e3  |e4  |
|Tue |10  |B   |f1  |f2  |f3  |f4  |
|Tue |11  |B   |g1  |g2  |g3  |g4  |
|Tue |12  |C   |h1  |h2  |h3  |h4  |
|Wed |9   |A   |i1  |i2  |i3  |i4  |

Выход:

|day |time|type|1   |2   |3   |4   |#A  |
|Mon |9   |A   |a1  |a2  |a3  |a4  |0   |
|Mon |10  |B   |b1  |b2  |b3  |b4  |1   |
|Mon |12  |A   |c1  |c2  |c3  |c4  |1   |
|Mon |20  |C   |d1  |d2  |d3  |d4  |2   |
|Tue |9   |A   |e1  |e2  |e3  |e4  |0   |
|Tue |10  |B   |f1  |f2  |f3  |f4  |1   |
|Tue |11  |B   |g1  |g2  |g3  |g4  |1   |
|Tue |12  |C   |h1  |h2  |h3  |h4  |1   |
|Wed |9   |A   |i1  |i2  |i3  |i4  |0   |

Я пытался выполнить

select
x.day,x.time,x.type,x.1,x.2,x.3,x.4,count(*) as #A
from
Table as x
left outer join 
Table(where type=A) as y
on
y.day = x.day
and
y.time < x.time
group by
x.day,x.time,x.type,x.1,x.2,x.3,x.4

но это не дает мне правильного ответа с #A слишком низким.

Таблица довольно большая, с более чем 30M строками и более 50КБ типа A с порядком, вызвавшим отскок лимита памяти, не помогает отлаживать ошибки ...

Мне также нужно, чтобы это выполнялось как запланированное задание, я решил использовать поток данных или dataprep, чтобы помочь, но я бы предпочел решить его исключительно в BigQuery.

Любая помощь будет высоко ценится.

Спасибо!

РЕДАКТИРОВАТЬ: я пытаюсь отладить запрос на меньшем наборе данных.

1 Ответ

0 голосов
/ 15 января 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *, 
  COUNTIF(type = 'A') OVER(
    PARTITION BY day ORDER BY time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
  ) Count_of_A
FROM `project.dataset.table`   

с результатом как

Row day time    type    col1    col2    col3    col4    Count_of_A   
1   Mon 9       A       a1      a2      a3      a4      0    
2   Mon 10      B       b1      b2      b3      b4      1    
3   Mon 12      A       c1      c2      c3      c4      1    
4   Mon 20      C       d1      d2      d3      d4      2    
5   Tue 9       A       e1      e2      e3      e4      0    
6   Tue 10      B       f1      f2      f3      f4      1    
7   Tue 11      B       g1      g2      g3      g4      1    
8   Tue 12      C       h1      h2      h3      h4      1    
9   Wed 9       A       i1      i2      i3      i4      0    
...