SQL 中的速率计算
Rate calculation in SQL
现在,我真的不知道该如何解决这个问题。
我有一些用户可以处理不同类型的任务。
These tasks have many properties. I chose just 4 property for simplicity.
如果我将任务分配给用户,我必须为此分配评分。这个比率将决定我必须为他支付多少钱,当他完成他的任务时。
我有以下table。这些id字段是nullable(user_id除外),而且都是外键.
|-#-|-user_id-|-type_id-|-task_id-|-source_id-|-target_id-|--rate--|
| 1 | 12 | NULL | 1 | 1 | 2 | 0.0022 |
| 2 | 12 | NULL | 2 | 1 | 2 | 0.0101 |
| 3 | 12 | NULL | 1 | 2 | 1 | 0.0200 |
| 4 | 12 | NULL | 2 | 2 | 1 | 0.1011 |
| 5 | 12 | 1 | NULL | NULL | NULL | 0.0750 |
| 6 | 12 | 2 | 1 | NULL | NULL | 0.0520 |
| 7 | 12 | NULL | 1 | NULL | NULL | 0.9100 |
当然也有针对其他用户的费率。
现在有权重,只是从左到右的顺序(来自第 type_id 列)。
但是:重要的是:左边从第一列匹配,必须全部是等于分配的任务值或 NULL 值。 右边 必须等于分配的任务值或 NULL
示例 1
user_id: 12
type_id: 3
task_id: 2
source_id: 1
target_id: 2
#2 - 应选择 0.0101 比率。
示例 2
user_id: 12
type_id: 1
task_id: 2
source_id: 3
target_id: 4
#5 - 0.0750 应选择汇率。
示例 3
user_id: 12
type_id: 2
task_id: 1
source_id: 2
target_id: 3
#6 - 0.0520 应选择汇率。
到目前为止,我对此没有意见。但我无法解决以下问题:
示例 4
user_id: 12
type_id: 2
task_id: 2
source_id: 2
target_id: 3
应选择NONE。
示例 5
user_id: 12
type_id: 3
task_id: 1
source_id: 2
target_id: 3
应选择NONE。
我想你想要 order by
和 fetch first row
:
select t.*
from t
where user_id = 12 and
(type_id = 3 or type_id is null) and
(task_id = 2 or task_id is null) and
(source_id = 1 or source_id is null) and
(target_id = 2 or target_id is null)
order by ( (type_id is not null)::int +
(task_id is not null)::int +
(source_id is not null)::int +
(target_id is not null)::int
) desc
fetch first 1 row only;
这 returns 行符合您的条件,但具有最少 NULL
个值(即最具体的行)。
编辑:
如果您需要按顺序匹配它们,则 where
子句如下所示:
order by (type_id is not null)::int desc,
(task_id is not null)::int desc,
(source_id is not null)::int desc,
(target_id is not null)::int desc
现在,我真的不知道该如何解决这个问题。
我有一些用户可以处理不同类型的任务。
These tasks have many properties. I chose just 4 property for simplicity.
如果我将任务分配给用户,我必须为此分配评分。这个比率将决定我必须为他支付多少钱,当他完成他的任务时。
我有以下table。这些id字段是nullable(user_id除外),而且都是外键.
|-#-|-user_id-|-type_id-|-task_id-|-source_id-|-target_id-|--rate--|
| 1 | 12 | NULL | 1 | 1 | 2 | 0.0022 |
| 2 | 12 | NULL | 2 | 1 | 2 | 0.0101 |
| 3 | 12 | NULL | 1 | 2 | 1 | 0.0200 |
| 4 | 12 | NULL | 2 | 2 | 1 | 0.1011 |
| 5 | 12 | 1 | NULL | NULL | NULL | 0.0750 |
| 6 | 12 | 2 | 1 | NULL | NULL | 0.0520 |
| 7 | 12 | NULL | 1 | NULL | NULL | 0.9100 |
当然也有针对其他用户的费率。
现在有权重,只是从左到右的顺序(来自第 type_id 列)。
但是:重要的是:左边从第一列匹配,必须全部是等于分配的任务值或 NULL 值。 右边 必须等于分配的任务值或 NULL
示例 1
user_id: 12
type_id: 3
task_id: 2
source_id: 1
target_id: 2
#2 - 应选择 0.0101 比率。
示例 2
user_id: 12
type_id: 1
task_id: 2
source_id: 3
target_id: 4
#5 - 0.0750 应选择汇率。
示例 3
user_id: 12
type_id: 2
task_id: 1
source_id: 2
target_id: 3
#6 - 0.0520 应选择汇率。
到目前为止,我对此没有意见。但我无法解决以下问题:
示例 4
user_id: 12
type_id: 2
task_id: 2
source_id: 2
target_id: 3
应选择NONE。
示例 5
user_id: 12
type_id: 3
task_id: 1
source_id: 2
target_id: 3
应选择NONE。
我想你想要 order by
和 fetch first row
:
select t.*
from t
where user_id = 12 and
(type_id = 3 or type_id is null) and
(task_id = 2 or task_id is null) and
(source_id = 1 or source_id is null) and
(target_id = 2 or target_id is null)
order by ( (type_id is not null)::int +
(task_id is not null)::int +
(source_id is not null)::int +
(target_id is not null)::int
) desc
fetch first 1 row only;
这 returns 行符合您的条件,但具有最少 NULL
个值(即最具体的行)。
编辑:
如果您需要按顺序匹配它们,则 where
子句如下所示:
order by (type_id is not null)::int desc,
(task_id is not null)::int desc,
(source_id is not null)::int desc,
(target_id is not null)::int desc