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

标签 sql postgresql integer window-functions integer-division

我正在尝试从 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/

相关文章:

javascript - var notification = 新通知

mysql - 组合两个不同的数据集时子查询不返回数据

mysql - 按字段排序 + 按字母顺序

postgresql - 如何在 PostgreSQL 中查看 View 的 CREATE VIEW 代码?

c++ - 具有 2 字节(或更多)原子字节顺序的架构

MySQL:411M 行的平均查询速度较慢

ruby-on-rails - Hstore 查询以使用 ruby​​ on rails 查找与任何数组元素匹配的记录

postgresql - "Big"JSONB 列中的数据

java - 如何读取可能是 int 或 double 的输入?

java - Java 中的整数与字符串决策