使用 mysql 根据每个客户的日期将第一条记录与其他行进行比较



我有一个客户访问表。

对于每个客户,我想将第一条记录的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_idpost_vst_dt。最后筛选结果以仅包括与上一行(客户的最早条目(cust_id不同或vst_beg_dt大于前一post_vst_dt的行。

我实际上有点惊讶这有效,但它似乎为您的示例数据返回了正确的值。

相关内容

  • 没有找到相关文章

最新更新