基于数据库中多个字段进行排序的有效方法

问题描述 投票:0回答:1

假设我有以下带有这些字段的对象:

Student {
    age: number
    grade: x/100
    tests: number
    location: lat, long
}

我想根据所有四个字段统一排序。 SQL

order by
按顺序对这些字段进行排序,但这不是我的意思。

我知道我可以通过为每个字段分配权重来以“统一”方式排序,对这些值求和并基于此进行排序,比如说

0.25 * age + 0.25 * grade + 0.25 * tests + 0.25 * distance

但我必须对每个值进行标准化,否则它就没有意义。有没有更好的方法来进行这种排序?

我什至不确定这种类型的排序/算法叫什么,这就是我来这里的原因。

我们还可以说,每个老师的权重可能会发生变化,因为有些老师更看重成绩而不是距离或其他因素。每个老师的距离肯定会有所不同。有没有一种方法可以在我的数据库列中存储一个值并基于该值进行排序?可以说是一个索引。

我尝试过使用上面提到的公式。

postgresql algorithm sorting
1个回答
0
投票

看起来像加权和排序方法,最基本的方法是在应用权重之前将每个属性标准化为通用比例,例如。将每个属性缩放到 [0,1] 范围或使用 z 分数来确保均匀应用每个属性的权重,无论原始比例如何。

对于不同教师的权重,将其存储在与每个教师相关联的权重表中。

引入这些意识形态后,SQL 看起来会像这样 -

-- storing teacher preferences
CREATE TABLE TeacherWeights (
    teacher_id INT PRIMARY KEY,
    age_weight FLOAT,
    grade_weight FLOAT,
    tests_weight FLOAT,
    distance_weight FLOAT
);

-- get weighted sum based on teacher preferences
SELECT
    s.*,
    COALESCE(tw.age_weight, 0.25) * (age / age_max) +
    COALESCE(tw.grade_weight, 0.25) * (grade / grade_max) +
    COALESCE(tw.tests_weight, 0.25) * (tests / tests_max) +
    COALESCE(tw.distance_weight, 0.25) * (distance / distance_max) AS weighted_sum
FROM
    Student s
LEFT JOIN
    TeacherWeights tw ON s.teacher_id = tw.teacher_id
ORDER BY
    weighted_sum DESC;

age_max
grade_max
等表示归一化的最大值,合并函数处理未指定权重的情况,默认属性为 0.25 单位值。

© www.soinside.com 2019 - 2024. All rights reserved.