2015-05-27 3 views
2

У меня возникли проблемы с запуском итоговых итогов для меня в BigQuery.BigQuery running totalals

Я нашел пример, который работает здесь: BigQuery SQL running totals

SELECT word, word_count, SUM(word_count) OVER(ORDER BY word DESC) 
FROM [publicdata:samples.shakespeare] 
WHERE corpus = 'hamlet' 
AND word > 'a' LIMIT 30 

Но что я действительно хочу сделать - это подсчитать число самых популярных слов, которые покрывают 80% от общего word_count. Так что я пытался вычислить работает всего при заказе по word_count первым:

SELECT word, word_count, SUM(word_count) OVER(ORDER BY word_count DESC) 
FROM [publicdata:samples.shakespeare] 
WHERE corpus = 'hamlet' 
AND word > 'a' LIMIT 30 

Но я получаю это:

Row word word_count f0_ 
1 o'er 18   18 
2 answer 13   31 
3 meet 8   39 
4 told 5   44 
5 treason 4   **52** 
6 quality 4   **52** 
7 brave 3   55 

Ходовой общая не увеличивается от линии 5 до линии 6. Вероятно потому, что в обоих случаях word_count is 4.

Что я делаю неправильно?

Возможно, есть лучший способ? Мой план состоял в том, чтобы вычислить общее количество. Затем разделите его суммой (word_count) OVER() и фильтруйте только строки с менее чем 80%. Затем подсчитайте количество этих строк.

ответ

3

Во-первых, удалите «LIMIT 30» - это будет мешать предложению OVER().

Вам нужен коэффициент? Попробуйте RATIO_TO_REPORT:

SELECT word, word_count, RATIO_TO_REPORT(word_count) OVER(ORDER BY word_count DESC) 
FROM [publicdata:samples.shakespeare] 
WHERE corpus = 'hamlet' 
AND word > 'a' 

Вы хотите, чтобы последовательные строки с равными значениями увеличивались в любом случае? Определите порядок для этих рядов со вторым порядком:

SELECT word, word_count, RATIO_TO_REPORT(word_count) OVER(ORDER BY word_count DESC, word) 
FROM [publicdata:samples.shakespeare] 
WHERE corpus = 'hamlet' 
AND word > 'a' 

Вам нужны самые популярные слова, которые покрывают 80%? Возьмите эти коэффициенты, суммируйте их и отфильтруйте остальные:

SELECT word, word_count, sum_ratio 
FROM (
SELECT word, word_count, SUM(ratio) OVER(ORDER BY ratio, word) sum_ratio 
FROM (
    SELECT word, word_count, RATIO_TO_REPORT(word_count) OVER(ORDER BY word_count DESC, word) ratio 
    FROM [publicdata:samples.shakespeare] 
    WHERE corpus = 'hamlet' 
    AND word > 'a' 
) 
) 
WHERE sum_ratio>0.8 

Row word word_count sum_ratio  
1 is  313   0.8125175752219499 
2 it  361   0.827019644076648  
3 in  400   0.8430884184308841 
4 my  441   0.8608042421564295 
5 you  499   0.8808500381633391 
6 of  630   0.906158357771261  
7 to  635   0.9316675370586108 
8 and  706   0.9600289237938375 
9 the  995   0.9999999999999999 
+1

Спасибо большое! Это настоящая раздача оконных функций. –