我有一个只有 2150 万行的表格,代表从 1995 年开始在英国销售的特性。对于每个条目,我都根据当年的通货膨胀计算了一个新价格,现在我想标准化这个膨胀的价格以分配一个值在 1 到 100 之间。
表中的平均价格为 240000。数据偏斜,有 3/4 的数据低于平均值。 max为1.5亿,min为1000
使用下面的 SQL 查询规范化数据会导致 2000 万个属性被分配规范化价格 1。
UPDATE properties p
SET inflatedNorm = round(
1 + (
(p.inflatedPrice - MIN_PRICE) * (100 - 1) / (MAX_PRICE- MIN_PRICE)
)
);
我做错了什么? 2000 万个 1 肯定是错误的,应该有更多不同的值(value)分布,其中大部分都在平均价格附近。
最佳答案
不要四舍五入结果!让数据库存储小数点。所以:
UPDATE properties p
SET inflatedNorm = 1 + (p.inflatedPrice - MIN_PRICE) * (100.0 - 1) / (MAX_PRICE - MIN_PRICE);
另一个问题是价格如何。我将从:
select max(price), min(price)
from properties p;
如果最大值是最小值的 100 倍,那么您就会看到所看到的现象。范围是对您的计算唯一重要的事情,而不是范围内的实际分布。
也就是说,如果您考虑美国人的净 Assets 并将比尔·盖茨纳入您的数据,那么 99+% 的美国人的净 Assets 将低于比尔·盖茨的 1%。
关于mysql - 将价格数据从 1 标准化到 100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40391849/