我正试图从PGExercises.com中解决这个特殊问题:
https://www.pgexercises.com/questions/aggregates/rankmembers.html
问题的要点是给我一张俱乐部成员的桌子和他们预定的半个小时的时间(获得名单是两个表的一个简单的内部连接)。
我应该根据预定的总时数生成一个成员的降序,舍入到最近的10。我还需要使用RANK()窗口函数生成一个具有等级的列,并根据排名对结果进行排序。(结果产生30项记录。)
作者非常优雅的解决方案是:
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并将数字转换为文本,以便查看最后一个数字来决定是向上还是向下。
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。)
我的四舍五入逻辑怎么了?
发布于 2016-12-18 16:24:20
如果您希望舍入到最近的10,那么使用内置的round()函数:
select round(<whatever>, -1)第二个参数可以是否定的,-1表示数十,-2表示数百,依此类推。
发布于 2016-12-18 16:28:17
将任意数(范围)中的最接近的倍数圈为:
round(<value> / <range>) * <range>“最近”意味着距离边界之间正好一半的值被四舍五入。
这种方法适用于任意范围,如果您想要这样做的话,也可以转到最近的13或0.05:
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发布于 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 ( x和y是整数)等同于trunc(x/y)。其中,as浮点除法正确地旋转到最近的倍数。
https://stackoverflow.com/questions/41210358
复制相似问题