【问题标题】:Calculate percentage of group using GROUP BY使用 GROUP BY 计算组的百分比
【发布时间】:2013-05-31 19:59:18
【问题描述】:

我正在对数据集执行 GROUP BY 和 COUNT(*),我想计算每个组占总数的百分比。

例如,在这个查询中,我想知道每个州的 count() 占总数的多少(select count() from publicdata:samples.natality):

SELECT state, count(*)
FROM [publicdata:samples.natality]
GROUP by state

在 SQL 中有几种方法可以做到这一点,但我在 Bigquery 中没有找到方法,有人知道吗?

谢谢!

【问题讨论】:

  • 检查 ratio_to_report,最近宣布的窗口函数之一(答案中的示例)

标签: google-bigquery


【解决方案1】:

检查 ratio_to_report,最近公布的窗口函数之一:

SELECT state, ratio * 100 AS percent FROM (
 SELECT state, count(*) AS total, RATIO_TO_REPORT(total) OVER() AS ratio
 FROM [publicdata:samples.natality]
 GROUP by state
)

state   percent
AL      1.4201828131159113   
AK      0.23521048665998198  
AZ      1.3332896746620975   
AR      0.7709591206172346   
CA      10.008298605982642

【讨论】:

  • 刚看到昨天的帖子,有新功能,这正是我想要的,谢谢!
  • 有没有办法将 ROUND 与 RATIO_TO_REPORT 一起使用?或者使用 *100 进行百分比计算?我在第 1 行第 37 列遇到错误“"OVER""OVER""。期待:")"
  • 这是旧功能,现已弃用
  • 未“弃用”,但#standardSQL 肯定是首选(也是前进的最佳方式)。请参阅下面的 evan_b 答案。
【解决方案2】:

修改 Felipe 对标准 SQL BigQuery 方言而不是旧版 SQL 方言的回答如下所示:

select state, 100*(state_count / total) as pct
from (
  SELECT state, count(*) AS state_count, sum(count(*)) OVER() AS total
  FROM `bigquery-public-data.samples.natality` 
  GROUP by state
) s

标准 SQL BigQuery 聚合分析函数(又名“窗口函数”)的文档在此处: https://cloud.google.com/bigquery/docs/reference/standard-sql/analytic-function-concepts

【讨论】:

    【解决方案3】:

    您可以使用虚拟值作为键对总数进行自联接。例如:

    SELECT
      t1.state AS state,
      t1.cnt AS cnt,
      100 * t1.cnt / t2.total as percent
    FROM (
      SELECT
        state,
        COUNT(*) AS cnt,
        1 AS key
      FROM
        [publicdata:samples.natality]
      WHERE state is not null
      GROUP BY
        state) AS t1
    JOIN (
      SELECT
        COUNT(*) AS total,
        1 AS key
      FROM
        [publicdata:samples.natality]) AS t2
    ON t1.key = t2.key
    ORDER BY percent DESC
    

    【讨论】:

      【解决方案4】:

      您可以使用窗口函数按组获取总数的百分比,而无需子查询(改进了 evan_b 的解决方案):

      SELECT 
         state
         ,count(*) / (sum(count(*)) OVER()) as pct
      FROM  
         `bigquery-public-data.samples.natality` 
      GROUP BY 
         state
      

      【讨论】:

      • 感谢您提供简单的解决方案!
      猜你喜欢
      • 2016-07-02
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多