MySQL计数/跟踪条纹或连续日期 - 跟进

时间:2016-12-18 20:47:39

标签: mysql sql date

这是MySQL count / track streaks or consecutive dates

的后续问题

Matt提供给我早期问题的解决方案效果很好,但我现在遇到了一个问题,即我正在处理一个额外的列(prod_cond)。产品可以使用或新产品,并将列在相同的prod_id下。在这些情况下,条纹不再正确计算。

我在这里创建了一个示例:http://sqlfiddle.com/#!9/3f04c3/17

我无法使用此附加列正确显示它们。

+-----+------------+------------+-----------------------------------+
| id  | seller_id  | prod_id    | prod_cond    | date               |
+-----+------------+------------------------------------------------+
|   1 | 283        | 4243       | 1           | 2016-10-10 23:55:01 |
|   2 | 283        | 4243       | 2           | 2016-10-10 02:01:06 |
|   3 | 283        | 4243       | 1           | 2016-10-11 23:55:06 |
|   4 | 283        | 4243       | 2           | 2016-10-11 23:55:07 |
|   5 | 283        | 4243       | 1           | 2016-10-12 23:55:07 |
|   6 | 283        | 4243       | 2           | 2016-10-13 23:55:07 |
|   7 | 283        | 4243       | 1           | 2016-10-14 23:55:07 |
|   8 | 283        | 4243       | 2           | 2016-10-14 23:57:06 |
|   9 | 283        | 4243       | 1           | 2016-10-15 23:57:06 |
|  10 | 283        | 4243       | 2           | 2016-10-15 23:57:06 |
+-----+------------+------------+-------------+---------------------+

所以基本上我需要确定每个卖家(seller_id)销售产品(prod_id)的每个连续日期块,产品条件(prod_cond)new(1)或(2)使用。

这就是结果应该是这样的:

+------------+---------+---------+----------------+---------------+
| seller_id  | prod_id | cond_id | streak in days | begin streak  | 
+------------+---------+---------+----------------+---------------+
| 283        | 4243    | 1       | 3              | 2016-10-10    |
| 283        | 4243    | 1       | 2              | 2016-10-14    |
| 283        | 4243    | 2       | 2              | 2016-10-10    |
| 283        | 4243    | 2       | 3              | 2016-10-13    |
+------------+---------+---------+----------------+---------------|

但正如您在此处所见:http://sqlfiddle.com/#!9/3f04c3/17 它无法正常工作。

1 个答案:

答案 0 :(得分:1)

在MySQL中,您可以使用变量执行此操作:

select seller_id, prod_id, cond_id, count(*) as numdays,
       min(date), max(date)
from (select t.*,
             (@rn := if(@grp = concat_ws(':', seller_id, prod_id, cond_id), @rn + 1,
                         if(@grp := concat_ws(':', seller_id, prod_id, cond_id), @rn + 1, @rn + 1)
                        )
             ) rn
      from transact t cross join
           (select @grp := 0, @rn := '') params
      order by seller_id, prod_id, cond_id, date
     ) t
group by seller_id, prod_id, cond_id, date_sub(date(date), interval rn day)

这个想法是,对于每个组 - 基于卖家,产品和条件 - 查询枚举日期。然后,日期减去枚举值对于连续日期是恒定的。

Here是一个SQL小提琴,显示它正常工作。