这是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 它无法正常工作。
答案 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小提琴,显示它正常工作。