mysql - 将价格数据从 1 标准化到 100

标签 mysql sql

我有一个只有 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/

相关文章:

php - SQLSTATE[HY000] [2002] 操作超时

mysql - 性能最好的 MySql 'Friend' 表

sql - 查找多列的第一个非空值

sql - 是否有任何数据库索引可以提高 'like %keyword%' 查询的性能?

mysql - 我可以使用具有自定义日期格式的 MySQL 日期字段类型吗

php - MYSQL 额外行重复数字

php - 如何让我的PHP/mySQL注册更安全?

MySQL错误1064但不是保留字

mysql - MySQL 中的运动队和赛程表

SQL 连接 : Future of the SQL ANSI Standard (where vs join)?