在SQLite中获取一个数字的下限值?

30

我有一个包含保龄球中心某些联赛玩家得分的表的SQLite数据库。我正在尝试获取每个玩家ID的Score列的平均值。这个问题在于,我只需要平均值的整数部分,而且不应该四舍五入(例如:平均值为168.99应该返回168,而不是169)。

在Google上寻找类似解决方案时,我只找到了SQL Server和其他一些解决方案,但没有SQLite的解决方案,所以如果有人可以帮助我解决这个问题,我会非常感激!

到目前为止,我使用的是ROUND(AVG(s1.Score),2),然后在我的使用数据库的Java程序中截断额外的部分,通过将其转换为字符串、删除不需要的部分,然后将其强制转换为整数来完成,但如果可能的话,我更想在SQL中完成所有操作。

3个回答

50

你可以直接将其转换为整数。它会截断小数部分,相当于向下取整。


22
如果 x >= 0,那么 cast(x as int)floor(x) 的作用是相同的。 - mu is too short
4
@Adam:像case when x >= 0 then cast(x as int) when cast(x as int) = x then cast(x as int) else cast(x - 1.0 as int) end这样的语句应该可以工作,尽管它看起来有些丑陋。如果我确实需要这个功能,我可能会尝试添加一个适当的floor函数 - mu is too short
@Adam:对于 x >= 0(这应该是保龄球得分的情况,对吧?),快速简单的“转换”是一个不错的解决方案,只要注意洞口在哪里就可以了。 - mu is too short

20

您可以使用 round(value - 0.5) (在此处查看 链接)


4
这个解决方案也可以行得通,但是和另一个答案一样,只对 x >= 0 有效。例如,floor(-2.8) 应该返回 -3,但使用你的解决方案,floor((-2.8 - 0.5)) 会返回 -4。需要注意不改变原意,表达更清晰易懂。 - Jumbala
答案提到了 round 而不是 floor,并且它适用于负值。 - Ovidiu S.
1
很奇怪的是,即使在2022年,主流数据库系统如SQLite仍然无法正确处理像适当舍入这样的超基本事情。 - Sliq
round(2102.7 * 100 - 0.5) 的结果是 210269,看起来有些奇怪。 - MSL

1
版本3.35.0+开始,您可以使用floor()函数将数字向下舍入:
SELECT
  floor(10.0),    -- 10
  floor(10.1),    -- 10
  floor(10.5),    -- 10
  floor(10.9999), -- 10
  floor(-10.0),   -- 11
  floor(-10.1),   -- 11
  floor(-10.5),   -- 11
  floor(-10.9999) -- 11

2
FLOOR() 不是内置函数。它是数学函数()之一,需要自定义构建SQLite: https://www.sqlite.org/compile.html#enable_math_functions - forpas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接