BigQuery 运行 总计
BigQuery running totals
我在 BigQuery 中无法使用 运行 总计。
我找到了一个适用于此处的示例:
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 都是 4。
我做错了什么?
也许有更好的方法?我的计划是计算 运行 总数。然后将其除以 sum(word_count) OVER() 并仅过滤小于 80% 的行。然后计算这些行的数量。
首先,删除 "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
我在 BigQuery 中无法使用 运行 总计。
我找到了一个适用于此处的示例: 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 都是 4。
我做错了什么?
也许有更好的方法?我的计划是计算 运行 总数。然后将其除以 sum(word_count) OVER() 并仅过滤小于 80% 的行。然后计算这些行的数量。
首先,删除 "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