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 byfetch 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