SQL中的速率计算

时间:2018-03-10 17:27:20

标签: php sql postgresql postgresql-9.6

现在,我真的不知道如何解决这个问题。

我有能够处理不同类型任务的用户。

  

这些任务有很多属性。我为简单选择仅4 属性。

如果我将任务分配给用户,我必须为此分配提供费率。这个比率将决定他完成任务时我需要付多少钱。

我有下表。这些ID字段是可以为空的(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 应该被选中。

1 个答案:

答案 0 :(得分:1)

我认为您需要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;

这会返回符合条件的行,但会返回最少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