选择语句中的 SQL 增量列值

Posted

技术标签:

【中文标题】选择语句中的 SQL 增量列值【英文标题】:SQL Increment column value in select statement 【发布时间】: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? 【参考方案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;

【讨论】:

以上是关于选择语句中的 SQL 增量列值的主要内容,如果未能解决你的问题,请参考以下文章

在脚本mysql中重置自动增量列值

Apache Spark - 根据列值添加增量 ID

Pig + Hbase 原子增量列值

SQL - 增量案例语句 - 队列分析

记录历史的 T-SQL 中的增量负载

无法使用自动增量插入到 SQL Server CE