当我在codewar中练习mysql时,这个查询把我搞糊涂了,因为我在这个查询中找不到::numeric
和::text
的含义。
查询:在棒球比赛中,平均击球率是衡量击球手表现的一种简单且最常见的方法。平均击球率是通过将所有球员的点击率除以他们的at_bats数来计算的,通常显示为一个3位小数(即0.300)。
给定一个具有以下模式的yankees表,
STRING
返回一个包含player_name
、games
和batting_average
的表。
我们希望将batting_average
四舍五入到最接近的千分之一,因为这是棒球迷习惯看到它的方式。将其格式化为文本,并确保其小数点右侧有3位数字(如有必要,可用零填充)。
接下来,按照batting_average
对结果表进行排序,第一行的平均值最高。
最后,由于batting_average
是一个速率统计,少量的at_bats
可以显著改变平均值。为了纠正这一点,排除任何没有超过100次击球的球员。
输出的预期结果:
codewars的解决方案:
select player_name,
games,
round(hits::numeric / at_bats, 3)::text as batting_average
from yankees
where at_bats > 100
order by 3 desc
发布于 2019-05-30 13:06:09
round(hits::numeric / at_bats, 3)::text
-->
RIGHT(ROUND(hits / at_bats, 3), 3)
大多数情况下,数值和字符串值是可互换的。因此,您通常可以不从一个类型转换到另一个类型。
示例:
mysql> SELECT RIGHT(ROUND(7 / 120, 3), 3);
+-----------------------------+
| RIGHT(ROUND(7 / 120, 3), 3) |
+-----------------------------+
| 058 | -- leading zero works
+-----------------------------+
1 row in set (0.00 sec)
mysql> SELECT RIGHT(ROUND(120 / 120, 3), 3);
+-------------------------------+
| RIGHT(ROUND(120 / 120, 3), 3) |
+-------------------------------+
| 000 | -- Oops, "batting a thousande" fails
+-------------------------------+
1 row in set (0.00 sec)
所以:
SELECT IF(hits = at_bats, '1000', RIGHT(ROUND(hits / at_bats, 3), 3))
哦,这不太正确。但是谁能得到999.7的平均击球率呢?
https://stackoverflow.com/questions/56369699
复制相似问题