【问题标题】:aggregation condition in case when聚合条件
【发布时间】:2015-06-18 15:50:49
【问题描述】:

我有一个结构类似于下面的数据集

fruit, value
apple, 234
apple, 2341
pear, 3233
grape, 323
pear, 3234
grap 1234

我正在尝试通过执行如下所示的查询来查找范围底部 10% 范围内的数字范围的计数。 (查询的最终目标是计算并查看 calc 的范围以 10% 的增量增加)我还有一个 group by 子句,因此我希望将计数按水果分组并以这种方式聚合。 Bellow是我尝试过的查询

select fruit, count(case when (value <= (((max(value) - min(value)) * .1) + min(value))) then 1 end)
from fruit_juice
group by substring(fruit, 5, 5);

【问题讨论】:

    标签: mysql sql group-by case amazon-redshift


    【解决方案1】:

    聚合from 子句中的表以获得所需的限制。 Join 将这些结果返回给您的查询并将这些值用于查询:

    select substring(fj.fruit, 5, 5),
           sum(fj.value <= fmm.minv + (fmm.maxv - fmm.minv) * 0.1)
    from fruit_juice fj join
         (select substring(fruit, 5, 5) as fruit5,
                 max(value) as maxv, min(value) as minv
          from fruit_juice
          group by substring(fruit, 5, 5)
         ) fmm
         on fmm.fruit5 = substring(fj.fruit, 5, 5)
    group by substring(fruit, 5, 5);
    

    请注意,您的 group by 表达式应与 select 子句中的表达式匹配。

    编辑:

    我不确定您的问题中substring() 来自哪里,因此此版本将其删除:

    select fj.fruit, sum(fj.value <= fmm.minv + (fmm.maxv - fmm.minv) * 0.1)
    from fruit_juice fj join
         (select fruit,
                 max(value) as maxv, min(value) as minv
          from fruit_juice
          group by fruit
         ) fmm
         on fmm.fruit = fj.fruit
    group by fruit;
    

    【讨论】:

    • 对不起,子字符串是我忘记取出的东西
    • 您能否更进一步,以便我了解并告诉我如何计算 10% 和 20%。另外,为什么在 select 语句中有 sum 子句?不应该算数吗?
    • 你也不能对 bool 值求和,所以我不认为你有什么工作
    • @user2524994 。 . .您的问题被标记为 MySQL,您可以在 MySQL 中对布尔表达式求和。在其他数据库中,我会改用case,但我使用它是因为标签非常明确。
    猜你喜欢
    • 2020-02-27
    • 2021-08-24
    • 2019-08-13
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2015-08-17
    • 2019-11-17
    相关资源
    最近更新 更多