【问题标题】:Grouping a percentage calculation in postgres/redshift在 postgres/redshift 中对百分比计算进行分组
【发布时间】:2020-07-31 23:49:24
【问题描述】:

我一遍又一遍地遇到同样的问题,希望有人能帮忙......

我有一个包含 28 个驴品种条目的类别列的大表,然后我在子查询中计算按这些类别中的每一个分组的两个特定值,如下所示:

WITH totaldonkeys AS (
    SELECT donkeybreed,
           COUNT(*) AS total
    FROM donkeytable1
    GROUP BY donkeybreed
)
,
sickdonkeys AS (
    SELECT donkeybreed,
           COUNT(*) AS totalsick
    FROM donkeytable1
    JOIN donkeyhealth on donkeytable1.donkeyid = donkeyhealth.donkeyid
    WHERE donkeyhealth.sick IS TRUE
    GROUP BY donkeybreed
)
,

我的目标是最终得到一个表格,该表格主要包含每个品种的病驴百分比,但我总是在不使用聚合函数的情况下无法分组的问题上苦苦挣扎,这是我无法做到的这里:

SELECT (CAST(sickdonkeys.totalsick AS float) / totaldonkeys.total) * 100 AS percentsick,
                totaldonkeys.donkeybreed
    FROM totaldonkeys, sickdonkeys
    GROUP BY totaldonkeys.donkeybreed

当我运行此程序时,我最终得到了每种驴种的 28 个结果,我相信其中一个是正确的,但显然有数百个无用的数据点。

我知道我在这里可能真的很愚蠢,但我不断地用新的 donkeydata 一次又一次地遇到同样的问题,我显然应该以一种新的方式来构建整个事情,因为你不能做这个最终查询如果没有聚合函数,我想我一定会遗漏一些重要的东西。

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。
  • 我会在这个网站上不惜一切代价避免使用“显而易见”这个词。
  • 只是为了更新以防其他人看到这一点,这是我在最后一个查询中调用这两个表的疯狂方式,这就是问题所在。我最近将它用作一种技术,在这里不合适,加入 donkeybreed 修复了它。

标签: sql postgresql group-by percentage


【解决方案1】:

您可以轻松统计donkeyhealth 表中患病的比例

SELECT d.donkeybreed,
       AVG( (dh.sick)::int ) AS proportion_sick
FROM donkeytable1 d JOIN
     donkeyhealth  dh
     ON d.donkeyid = dh.donkeyid
GROUP BY d.donkeybreed

【讨论】:

  • 嘿嘿,谢谢你的回复 :) 我捏造了很多上下文,它最初不是关于驴的 ;) 我真的想最终得到定义的整体子集的百分比通过另外两个表中的数据。我在这里尝试了你的建议,我遇到的问题是它是一个无效操作,因为驴健康的 WHERE 条件是验证字符串而不是整数值。我想也许我没有帮助,对不起,我觉得必须有一种方法来计算我没有看到的这样的百分比。
  • 而且我实际上有两个不同的 where 条件取决于两个不同的表来指定驴生病了...
  • @MrGrumpy 。 . .实际上,where 子句根本不应该存在。至于AVG( (dh.sick)::int )。 . .你需要一个布尔表达式,比如AVG( (dh.status = 'sick')::int )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 2021-05-18
  • 2010-11-22
相关资源
最近更新 更多