首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgres中将整数舍入到最接近的10

在Postgres中将整数舍入到最接近的10
EN

Stack Overflow用户
提问于 2016-12-18 16:21:14
回答 4查看 25.7K关注 0票数 17

我正试图从PGExercises.com中解决这个特殊问题:

https://www.pgexercises.com/questions/aggregates/rankmembers.html

问题的要点是给我一张俱乐部成员的桌子和他们预定的半个小时的时间(获得名单是两个表的一个简单的内部连接)。

我应该根据预定的总时数生成一个成员的降序,舍入到最近的10。我还需要使用RANK()窗口函数生成一个具有等级的列,并根据排名对结果进行排序。(结果产生30项记录。)

作者非常优雅的解决方案是:

代码语言:javascript
复制
select firstname, surname, hours, rank() over (order by hours) from
(select firstname, surname,
((sum(bks.slots)+5)/20)*10 as hours

from cd.bookings bks
inner join cd.members mems
    on bks.memid = mems.memid
group by mems.memid
) as subq
order by rank, surname, firstname;

不幸的是,作为一个SQL新手,我非常不优雅的解决方案要复杂得多,它使用CASE WHEN并将数字转换为文本,以便查看最后一个数字来决定是向上还是向下。

代码语言:javascript
复制
SELECT
firstname,
surname,
CASE 
  WHEN (SUBSTRING(ROUND(SUM(slots*0.5),0)::text from '.{1}$') IN ('5','6','7','8','9','0')) THEN CEIL(SUM(slots*0.5) /10) * 10 
  ELSE FLOOR(SUM(slots*0.5) /10) * 10 
END AS hours,
RANK() OVER(ORDER BY CASE 
  WHEN (SUBSTRING(ROUND(SUM(slots*0.5),0)::text from '.{1}$') IN ('5','6','7','8','9','0')) THEN CEIL(SUM(slots*0.5) /10) * 10 
  ELSE FLOOR(SUM(slots*0.5) /10) * 10 
END DESC) as rank
FROM cd.bookings JOIN cd.members
ON cd.bookings.memid = cd.members.memid
GROUP BY firstname, surname
ORDER BY rank, surname, firstname;

尽管如此,我还是设法把它弄得恰到好处--在这30张唱片中,我得到了一个边缘,它的名字是'Ponder‘,姓氏是'Stephens’。他的四舍五入的小时数是124.5,但该解决方案坚持将其舍入最接近的10,会产生120的结果,而我的解决方案则生成130

(顺便说一句,还有其他几个例子,比如在我的和练习作者的解决方案中,204.5舍入到210。)

我的四舍五入逻辑怎么了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-18 16:24:20

如果您希望舍入到最近的10,那么使用内置的round()函数:

代码语言:javascript
复制
select round(<whatever>, -1)

第二个参数可以是否定的,-1表示数十,-2表示数百,依此类推。

票数 40
EN

Stack Overflow用户

发布于 2016-12-18 16:28:17

将任意数(范围)中的最接近的倍数圈为:

代码语言:javascript
复制
round(<value> / <range>) * <range>

“最近”意味着距离边界之间正好一半的值被四舍五入。

这种方法适用于任意范围,如果您想要这样做的话,也可以转到最近的130.05

代码语言:javascript
复制
round(64 / 10) * 10 —- 60
round(65 / 10) * 10 —- 70

round(19.49 / 13) * 13 -- 13
round(19.5 / 13) * 13 -- 26

round(.49 / .05) * .05 -- 0.5
round(.47 / .05) * .05 -- 0.45
票数 8
EN

Stack Overflow用户

发布于 2017-07-17 12:15:20

我一直在为一个同样的问题而挣扎。我需要把数字四舍五入到最接近的50倍。戈登的建议在这里行不通。

我的第一次尝试是SELECT round(120 / 50) * 50,这给了100。然而,SELECT round(130 / 50) * 50给了100。这是错误的;最近的倍数是150

诀窍是使用浮点数进行除法,例如SELECT round(130 / 50.0) * 50将给150

原来,做x/y ( xy是整数)等同于trunc(x/y)。其中,as浮点除法正确地旋转到最近的倍数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41210358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档