我正在尝试创建一个新变量,根据一系列日期和阶梯级别(null-E)在 MySQL 中填充 1(真)、0(假)。
参见小提琴:http://sqlfiddle.com/#!9/9975e1
其中 record_dates 和ladder_levels 不一定按顺序排列。我想通过 casewhen (?) 语句返回ladder_change字段,其内容如下:
- First, look only within matching IDs (i.e. just for ID 324)
- 然后,类似:
case when record_date2 > record_date1 AND (ladder_level2 < ladder_level1 OR ladder_level2>ladder_level1) then 1, else 0
关于如何实现这一目标有什么建议吗?
- 由于没有定义主键,我假设数据是按顺序输入的
creation_date
and ladder_level
. Remember该数据以无序方式存储在 MySQL 中。
- 首先,我们必须使用子选择查询来按所需顺序获取数据(如上一步中突出显示的)。值得注意的是
Order By
之后执行Select
条款;所以我们需要首先对数据进行排序,然后使用结果集作为派生表.
- 现在,我们将借助用户定义变量(会话级持久且可访问)。在另一个派生表中
user_init_vars
,我们初始化它们。
- In the
Select
子句中,我们将当前行的值与前一行的值进行比较。比较后,我们将变量值设置为当前行的值。您可以将其视为循环技术,我们在 PHP、C++、Java 等其他编程语言中使用它。
-
Case .. When表达式用于比较,并确定
ladder_change
value.
Query #1
SELECT
dt.ID,
CASE WHEN DATE(@rd) <> DATE(dt.record_date) AND
dt.ladder_level > @ll
THEN 1
ELSE 0
END AS ladder_change,
@rd := dt.record_date AS record_date,
@ll := dt.ladder_level AS ladder_level
FROM (SELECT ID, record_date, ladder_level
FROM conv_example
ORDER BY ID, record_date, ladder_level) AS dt
CROSS JOIN (SELECT @rd := '',
@ll := '') AS user_init_vars;
| ID | ladder_change | record_date | ladder_level |
| ----- | ------------- | ------------------- | ------------ |
| 324 | 0 | 2016-09-15 00:00:00 | a |
| 324 | 0 | 2016-09-15 00:00:00 | b |
| 324 | 0 | 2017-04-07 00:00:00 | b |
| 324 | 0 | 2017-04-07 00:00:00 | c1 |
| 324 | 0 | 2018-09-08 00:00:00 | c1 |
| 324 | 0 | 2018-09-08 00:00:00 | e |
| 1234 | 0 | 2013-04-03 00:00:00 | |
| 1234 | 0 | 2014-07-03 00:00:00 | a |
| 1234 | 1 | 2015-04-01 00:00:00 | b |
| 1234 | 1 | 2016-09-15 00:00:00 | d |
| 1234 | 0 | 2017-02-04 00:00:00 | b |
| 1234 | 0 | 2017-04-03 00:00:00 | b |
| 1234 | 1 | 2017-04-07 00:00:00 | c1 |
| 1234 | 1 | 2018-09-08 00:00:00 | e |
| 31431 | 0 | 2013-04-03 00:00:00 | |
| 31431 | 0 | 2014-07-03 00:00:00 | a |
| 31431 | 1 | 2017-04-07 00:00:00 | c1 |
| 31431 | 1 | 2018-09-08 00:00:00 | e |
在 DB Fiddle 上查看
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)