请问如何通过sql制定规则?
How to make a rule by sql please?
我有一个名为 flup 的 table 和一些数据,例如:
pid, flup_time, degree, oc, flup_type
1, 2018-05-06, 1, 0, 2
1, 2018-08-01, 2, 0, 3
1, 2018-08-13, 2, 0, 1
1, 2018-08-25, 2, 1, 1
1, 2018-11-20, 2, 1, 2
1, 2019-01-09, 2, 1, 2
2, 2018-06-01, 1, 0, 2
2, 2018-08-27, 2, 0, 2
2, 2018-11-30, 2, 0, 2
...
首先,找到所有数据按pid分组,对于这个pid(这里pid=1),按flup_time asc排序。给定一个时间段(比如从 2018-01-01 到 2019-07-01),对于每一行,制定规则:
规则 1。如果度数 = 1,则下一个 flup_time 必须在 90 天内。
规则 2。如果 degree = 2 且 oc != 1,则下一个 flup_time 必须在 15 天内。
规则 3。如果 degree = 2 且 oc = 1,则下一个 flup_time 必须在 90 天内。
我想创建一个视图 (flup_view),包含 flup 的所有列,以及更多名为 pass_check 的列。如果该行满足rule1,2,3,则pass_check = 1,否则pass_check = 2。如:
pid, flup_time, degree, oc, flup_type, pass_check
1, 2018-05-06, 1, 0, 2, -1
1, 2018-08-01, 2, 0, 3, 1
1, 2018-08-13, 2, 0, 1, 1
1, 2018-08-25, 2, 1, 1, 1
1, 2018-11-20, 2, 1, 2, 1
1, 2019-01-09, 2, 1, 2, 1
2, 2018-06-01, 1, 0, 2, -1
2, 2018-08-27, 2, 0, 2, 1
2, 2018-11-30, 2, 0, 2, 2
请问 sql 如何做到这一点?
要使此功能正常运行,您需要几个部分。我不确定您的 SQL 背景有多强,所以我也会介绍一些基础知识。
首先,为了创建规则,您需要使用 CASE WHEN:
https://www.w3schools.com/sql/func_mysql_case.asp
接下来,您需要为每个ID获取以下行,您需要使用LEAD函数。这是一个总体概述:
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html
和 LAG 教程,与 LEAD 相同,但它检查上面的行而不是下面的行:
http://www.mysqltutorial.org/mysql-window-functions/mysql-lag-function/
(LEAD 在 MySQL 的早期版本中不存在,所以你的版本可能没有这个)
最后,您想使用 DATE_ADD 函数比较日期:
https://www.w3schools.com/sql/func_mysql_date_add.asp
会有点复杂,但这三件事应该足以让您构建所需的查询。
我有一个名为 flup 的 table 和一些数据,例如:
pid, flup_time, degree, oc, flup_type
1, 2018-05-06, 1, 0, 2
1, 2018-08-01, 2, 0, 3
1, 2018-08-13, 2, 0, 1
1, 2018-08-25, 2, 1, 1
1, 2018-11-20, 2, 1, 2
1, 2019-01-09, 2, 1, 2
2, 2018-06-01, 1, 0, 2
2, 2018-08-27, 2, 0, 2
2, 2018-11-30, 2, 0, 2
...
首先,找到所有数据按pid分组,对于这个pid(这里pid=1),按flup_time asc排序。给定一个时间段(比如从 2018-01-01 到 2019-07-01),对于每一行,制定规则:
规则 1。如果度数 = 1,则下一个 flup_time 必须在 90 天内。
规则 2。如果 degree = 2 且 oc != 1,则下一个 flup_time 必须在 15 天内。
规则 3。如果 degree = 2 且 oc = 1,则下一个 flup_time 必须在 90 天内。
我想创建一个视图 (flup_view),包含 flup 的所有列,以及更多名为 pass_check 的列。如果该行满足rule1,2,3,则pass_check = 1,否则pass_check = 2。如:
pid, flup_time, degree, oc, flup_type, pass_check
1, 2018-05-06, 1, 0, 2, -1
1, 2018-08-01, 2, 0, 3, 1
1, 2018-08-13, 2, 0, 1, 1
1, 2018-08-25, 2, 1, 1, 1
1, 2018-11-20, 2, 1, 2, 1
1, 2019-01-09, 2, 1, 2, 1
2, 2018-06-01, 1, 0, 2, -1
2, 2018-08-27, 2, 0, 2, 1
2, 2018-11-30, 2, 0, 2, 2
请问 sql 如何做到这一点?
要使此功能正常运行,您需要几个部分。我不确定您的 SQL 背景有多强,所以我也会介绍一些基础知识。
首先,为了创建规则,您需要使用 CASE WHEN: https://www.w3schools.com/sql/func_mysql_case.asp
接下来,您需要为每个ID获取以下行,您需要使用LEAD函数。这是一个总体概述: https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html 和 LAG 教程,与 LEAD 相同,但它检查上面的行而不是下面的行: http://www.mysqltutorial.org/mysql-window-functions/mysql-lag-function/ (LEAD 在 MySQL 的早期版本中不存在,所以你的版本可能没有这个)
最后,您想使用 DATE_ADD 函数比较日期: https://www.w3schools.com/sql/func_mysql_date_add.asp
会有点复杂,但这三件事应该足以让您构建所需的查询。