Recuento / seguimiento de MySQL o dates consecutivas

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

En la tabla anterior, ¿cómo extraería la siguiente información usando una consulta MySQL?

 +------------+---------+----------------+---------------+ | seller_id | prod_id | streak in days | begin streak | +-----+------------+--------------------+---------------+ | 283 | 4243 | 4 | 2016-10-10 | | 287 | 4243 | 1 | 2016-10-10 | | 311 | 4243 | 1 | 2016-10-11 | | 311 | 4243 | 3 | 2016-10-13 | | 287 | 4243 | 1 | 2016-10-14 | +------------+---------+----------------+---------------| 

Entonces, básicamente, necesito identificar cada bloque de dates consecutivas para cada vendedor (seller_id) que vende productos (prod_id).

Limité este ejemplo a 1 prod_id y solo a un range de pocos días, pero los vendedores sí venden más de 1 producto (prod_id)

 SELECT seller_id ,prod_id ,COUNT(*) as StreakInDays ,MIN(DateCol) as BeginStreak FROM ( SELECT seller_id ,prod_id ,DATE(DateCol) as DateCol ,(@rn:= if((@seller = seller_id) AND (@prod = prod_id), @rn + 1, if((@seller:= seller_id) AND (@prod:= prod_id), 1, 1) ) ) as RowNumber FROM Transact t CROSS JOIN (SELECT @seller:=0, @prod:=0, @rn:=0) var ORDER BY seller_id ,prod_id ,DATE(DateCol) ) t GROUP BY seller_id ,prod_id ,DATE_SUB(DateCol, INTERVAL RowNumber Day) ORDER BY prod_id ,DATE_SUB(DateCol, INTERVAL RowNumber Day) ,seller_id 

Genere un número de fila particionada dividida por seller_id y prod_id. Luego use Date – RownNumber como una agrupación y puede get su respuesta por simple agregación.

SQL Fiddle para mostrarle que funciona para múltiples productos, vendedores, etc. http://sqlfiddle.com/#!9/0a0c44/8/0

Tenga en count que si es posible que el mismo vendedor tenga más de 1 transacción para un producto el mismo día, deberá replace el Transact con una tabla derivada de DISTINCT seller_id, prod_id, DATE (date) antes de generar el número de fila como esta:

 SELECT seller_id ,prod_id ,COUNT(*) as StreakInDays ,MIN(DateCol) as BeginStreak FROM ( SELECT seller_id ,prod_id ,DateCol ,(@rn:= if((@seller = seller_id) AND (@prod = prod_id), @rn + 1, if((@seller:= seller_id) AND (@prod:= prod_id), 1, 1) ) ) as RowNumber FROM (SELECT DISTINCT seller_id, prod_id, DATE(DateCol) as DateCol FROM Transact )t CROSS JOIN (SELECT @seller:=0, @prod:=0, @rn:=0) var ORDER BY seller_id ,prod_id ,DateCol ) t GROUP BY seller_id ,prod_id ,DATE_SUB(DateCol, INTERVAL RowNumber Day) ORDER BY prod_id ,DATE_SUB(DateCol, INTERVAL RowNumber Day) ,seller_id 

http://sqlfiddle.com/#!9/0a0c44/11