【问题标题】:Calculating % of COUNT with groupby function in bigquery在 bigquery 中使用 groupby 函数计算 COUNT 的百分比
【发布时间】:2021-10-08 00:47:55
【问题描述】:

在弄清楚如何添加额外的列时遇到了一些问题,该列将为我提供 count 函数总和的百分比。我的查询如下所示:


    Select
       count(*) AS num_rides,
       member_casual
    FROM `2020_bikeshare_data`
    GROUP BY member_casual
    ORDER BY num_rides DESC

然后返回这个结果:

num_rides member_casual
2134988 member
1341217 casual

我想做的是添加一个第三列,列出每个成员在总数中所占的百分比

num_rides member_casual perc_tot
2134988 member 61.4%
1341217 casual 38.6

想法?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    你的窗口函数:

    SELECT member_casual,
           COUNT(*) AS num_rides,
           COUNT(*) * 1.0 / SUM(COUNT(*)) OVER ()
    FROM `2020_bikeshare_data`
    GROUP BY member_casual
    ORDER BY num_rides DESC;
    

    不需要子查询。

    【讨论】:

    • 效果很好。我不确定我是否理解如何?我是所有这些爵士乐和学习的新手,再次感谢您的帮助
    • @PeterFonteneau 。 . .窗口函数绝对是你应该学习的东西:cloud.google.com/bigquery/docs/reference/standard-sql/…。如果有 BQ 文档不清楚,网上还有很多其他文档。
    【解决方案2】:

    最简单的方法是使用子查询作为列表达式的一部分来计算您的百分比:

    select 
        count(1) as num_rides,
        member_casual,
        sum(100) / (select sum(1.0) from `2020_bikeshare_data`) as perc_tot -- return as percentage
    from
        `2020_bikeshare_data`
    group by
        member_casual
    

    【讨论】:

      【解决方案3】:

      使用子查询,获取总行数并相应地计算百分比。

       Select
             count(*) AS num_rides,
             member_casual,
             Concat(count(*) * 100 / totalRecord,' %') as perc_tot
        FROM (SELECT *,COUNT(*) as totalRecord FROM `2020_bikeshare_data`) 
        GROUP BY member_casual
      

      Select
             count(*) AS num_rides,
             member_casual,
             Concat(count(*) * 100 / (SELECT COUNT(*) FROM `2020_bikeshare_data`) ,' %') as perc_tot
      FROM `2020_bikeshare_data`
      GROUP BY member_casual
      

      【讨论】:

      • 此语法在 BigQuery 中有效吗? ANSI SQL 将为您的子查询引发错误,因为它在您的 SELECT 中包含一个列而不是聚合的一部分。
      • 它应该可以工作,因为没有特定的语法
      • 不,那个子查询(在第一个代码 sn-p 中)不会在 BigQuery 中运行。
      【解决方案4】:

      考虑以下方法

      select distinct member_casual,
        count(num_rides) over type as num_rides,
        round(count(num_rides) over type * 100.0 / count(num_rides) over(), 2) as perc_tot
      from `2020_bikeshare_data`
      window type as (partition by member_casual)
      # order by num_rides desc             
      

      如果应用于您问题中的样本数据 - 输出是

      【讨论】:

        【解决方案5】:

        除了其他答案之外,您还可以通过使用 CTE 组织将其分解为简单的 SQL(没有窗口函数)。

        with 
            data as (select * from `2020_bikeshare_data`),
            total as (select count(*) as ride_count from data),
            by_type as (select member_casual, count(*) as ride_count from data group by 1)
        select
            member_casual,
            by_type.ride_count as num_rides,
            by_type.ride_count / total.ride_count as perc_tot
        from by_type
        cross join total
        

        在我看来,这更容易看到perc_tot 的计算。

        【讨论】:

          猜你喜欢
          • 2021-02-20
          • 2022-11-21
          • 2022-06-13
          • 1970-01-01
          • 2020-09-21
          • 2020-12-03
          • 2017-02-15
          • 1970-01-01
          • 2022-06-23
          相关资源
          最近更新 更多