【问题标题】:SQL calculation of percentage with group by with condition and sum of distinct itemsSQL计算百分比与分组条件和不同项目的总和
【发布时间】:2021-10-15 22:02:08
【问题描述】:

我正在处理如下表格:

现在我的目标是使用 SQL 计算按邮政编码划分的不同 ID 的数量以及按邮政编码分组的欺诈性 ID 的百分比。重要提示:同一个 ID 可以多次出现,有时是欺诈,有时不是。如果 ID 至少有一次欺诈,则视为欺诈。只有始终为“真实”的 ID 才算作非欺诈。

所以想要的输出应该是这样的:

创建查询最有效的方法是什么?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql group-by subquery percentage


【解决方案1】:

使用两个级别的聚合:

select zip_code, count(*) as num_ids,
       avg(case when fraud = 'true' then 1.0 else 0 end) as fraud_ratio
from (select zip_code, id, count(*) as cnt,
             min(fraud) as fraud
      from t
      group by zip_code, id
     ) t
group by zip_code;

注意:这使用'true' < 'false'作为字符串这一事实。

【讨论】:

  • 谢谢。但是,我收到错误代码:第 7:37 行:不匹配的输入“。”。期待:'(',',','cross','except','full','group','having','inner','intersect','join','left','limit', 'natural'、'order'、'right'、'tablesample'、'union'、'where'、(服务:amazonathena;状态码:400;错误码:invalidrequestexception;
  • @Minfetli 。 . .代码作为书面作品:dbfiddle.uk/…。它是标准 SQL,应该适用于任何数据库。
【解决方案2】:

使用以下查询。这是伪sql,但我想你能明白这一点。

我们按zip_code 分组,使用count distinct 计算不同的id,最后将百分比计算为组中项目总数与欺诈项目的比率= 1。

SELECT 
  zip_code, 
  COUNT(DISTINCT id) AS number_distinct, 
  ((SUM(IF fraud = 'true' THEN 1 ELSE 0 END) / COUNT(*)) * 100) AS percentage
FROM 
  table
GROUP BY 
  zip_code

【讨论】:

  • 谢谢!我在描述中犯了一个小错误。 Fraud 列不是由 1 和 0 组成,而是由 True 和 False 组成。这会改变查询吗?
  • 稍作改动,我修改了答案。
  • 这会产生错误:第 4:14 行:不匹配的输入“欺诈”。期待:(服务:amazonathena;状态代码:400;错误代码:invalidrequestexception;
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2021-03-24
  • 1970-01-01
  • 2020-12-23
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多