【问题标题】:SQL Increment column value in select statement选择语句中的 SQL 增量列值
【发布时间】:2015-07-22 08:49:35
【问题描述】:

我正在尝试编写一个 Select 语句,它将 column 的值增加 50,但范围最终可能是 200,000,因此我无法在 case 语句中手动完成所有操作。

与此类似,但不是手动编写increments

Select count(order_id) as order_count, 
   case when revenue between 0 and 50 then ‘$50’
        when order_value between 51 and 100 then ‘$100’
             else ‘over $101’
   end as revenue_bucket
from Orders
group by 2

【问题讨论】:

  • 那么,单列,每行加50?
  • 类似:收入 - (revenue % 50) + 50?

标签: sql postgresql amazon-redshift


【解决方案1】:

把你的revenue 变成桶值,然后把它变成字符串:

SELECT count(order_id) AS order_count, 
        '$' || ((((revenue - 0.01)/50)::int + 1) * 50)::text AS revenue_bucket
FROM Orders
GROUP BY 2;

这显然超过了 200,000 美元。

【讨论】:

  • 这将在51-100 存储桶中对50 进行排序(简单修复:从收入中减去1)
  • @Andomar 好点。答案已更新,但只减去一美分而不是一美元。
【解决方案2】:

您可以使用模数来获得这个。在您的示例中,限制为 101。您所要做的就是将结果转换为字符串并在其前面添加 $

Select count(order_id) as order_count, 
    case when revenue < limit then revenue - (revenue % 50) + 50
             else ‘over $101’
  end as revenue_bucket
from Orders
group by 2

【讨论】:

  • 呃,你是对的 :) 我会在几秒钟内移除 cmets +1
  • k,我只是想知道我是不是做错了什么,没问题^^
【解决方案3】:

您可以使用div(整数除法)四舍五入到最接近的 50:

revenue div 50 * 50

向上取整而不是向下取整:

(revenue div 50 + 1) * 50

在下一个括号中包含 50(因此 50 为 50 美元而不是 100 美元):

((revenue-1) div 50 + 1) * 50

查询示例:

select  revenue
,       concat('$', ((revenue-1) div 50 + 1) * 50) as revenue_bucket
from    YourTable

See it working at SQL Fiddle.

【讨论】:

    【解决方案4】:

    想出了类似的东西

    select floor((revenue+49)/50)*50 as revenue_bucket, 
           count(1) as order_count
    from Orders 
    group by 1;
    

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多