我有一个客户访问表。
对于每个客户,我想将第一条记录的post_vst_dt
与第二条记录的vst_beg_dt
进行比较。
如果第二个访问记录的vst_beg_dt
大于第一个记录的post_vst_dt
则需要选择两个记录,否则必须将第一个记录的post_vst_dt
与第三个记录的vst_beg_dt
进行比较。
基于相同的条件检查,必须同时选择第一条和第三条记录,或者只选择第一条记录。
这需要为所有客户进行检查,每个客户都可以进行任意次数的访问。
是否可以使用 SQL 或使用带有循环和游标的 mysql 过程来完成此操作。有人可以帮忙吗?
| Visit_ID | Cust_ID | Vst_Beg_Dt | Vst_End_Dt | Post_vst_Dt |
|----------+---------+------------+------------+-------------|
| 445 | 545 | 2015-11-23 | 2015-11-28 | 2016-01-12 |
| 198 | 545 | 2016-01-07 | 2016-01-12 | 2016-02-26 |
| 271 | 545 | 2016-01-19 | 2016-01-29 | 2016-03-14 |
| 841 | 291 | 2015-09-08 | 2015-09-12 | 2015-10-27 |
| 987 | 291 | 2015-12-19 | 2015-12-23 | 2016-02-06 |
| 211 | 291 | 2015-12-26 | 2016-01-06 | 2016-02-20 |
| 122 | 291 | 2016-02-25 | 2016-02-27 | 2016-04-12 |
预期输出为
| Visit_ID | Cust_ID | Vst_Beg_Dt | Vst_End_Dt |
|----------+---------+------------+------------|
| 445 | 545 | 2015-11-23 | 2015-11-28 |
| 271 | 545 | 2016-01-19 | 2016-01-29 |
| 841 | 291 | 2015-09-08 | 2015-09-12 |
| 987 | 291 | 2015-12-19 | 2015-12-23 |
| 122 | 291 | 2016-02-25 | 2016-02-27 |
"第一"是指每个客户最小vst_beg_dt的记录
我认为这是一个类似于如何在MySQL中进行递归SELECT查询的问题。
我喜欢leftclickben对这个问题的回答。这是该查询的重新设计,我认为它适用于您的情况。
SELECT
v.visit_id, @cust := v.cust_id cust_id, v.vst_beg_dt, v.vst_end_dt,
@post := v.post_vst_dt post_vst_dt
FROM (SELECT * FROM visit ORDER BY cust_id, vst_beg_dt) v
JOIN (SELECT @cust := 0, @post := NULL) tmp
WHERE v.cust_id != @cust OR v.vst_beg_dt > @post;
本质上,您对结果进行排序,以便每个客户的访问都在一起并按日期顺序排列。然后在每一行上将@cust
和@post
变量分别更新为cust_id
和post_vst_dt
。最后筛选结果以仅包括与上一行(客户的最早条目(cust_id
不同或vst_beg_dt
大于前一post_vst_dt
的行。
我实际上有点惊讶这有效,但它似乎为您的示例数据返回了正确的值。