gpt4 book ai didi

sql - 在 Postgres 中将数字四舍五入到最接近的 10

转载 作者:行者123 更新时间:2023-11-29 11:26:06 26 4
gpt4 key购买 nike

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

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

问题的要点是,我得到了一张俱乐部成员的表格和他们预订的半小时时间段(获取列表是两个表格的简单 INNER JOIN)。

我应该根据预订的总小时数 对成员进行降序排列,四舍五入到最接近的 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”,姓氏是“斯蒂芬斯的。他的四舍五入小时数是 124.5 , 但解决方案坚持将其四舍五入到最接近的 10 应该产生 120 的结果,而我的解决方案产生 130 .

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

我的舍入逻辑有什么问题?

最佳答案

如果要四舍五入到最接近的 10,请使用内置的 round() 函数:

select round(<whatever>, -1)

第二个参数可以是负数,-1 代表十位,-2 代表百位,依此类推。

关于sql - 在 Postgres 中将数字四舍五入到最接近的 10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41210358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com