Возможно, вам лучше всего сделать это с переменными SQL ... так что вы всегда можете использовать то, что было у последнего человека, и соответствующую ему дату активности ...
SELECT
PreSort.customer_email,
@lastDate as LastOrderDate,
PreSort.Created_At,
if( @lastCust = PreSort.customer_email,
datediff( @lastDate, PreSort.Created_At ), null ) as DaysDiff,
@lastDate := PreSort.Created_At as PreserveDate,
@lastCust := PreSort.customer_email as PreserveCustomer
FROM
( select efso.customer_email,
efso.created_at
from eshop_flat_sales_order AS efso
where efso.status = 'complete'
order by efso.customer_email,
efso.created_at ) PreSort,
(SELECT @lastCust := '', @lastDate := null ) AS SqlVars
Теперь вы ищетев последний раз между фактическими заказами ... так что у вас есть статус "завершен" или "отменен" по сравнению с просто посещением вашего сайта и попыткой заказа ..
должен создать результирующий курсор что-то вроде
customer_email LastOrderDate created_at DaysDiff PreserveDate PreserveCustomer
-------------- ------------- ---------- ---------- ------------ ----------------
a(at)a.com NULL 12.1.10 NULL 12.1.10 a(at)a.com
a(at)a.com 12.1.10 18.1.10 6 18.1.10 a(at)a.com
b(at)a.com NULL 20.1.10 NULL 20.1.10 b(at)a.com
c(at)a.com NULL 16.1.10 NULL 16.1.10 c(at)a.com
c(at)a.com 16.1.10 18.1.10 2 18.1.10 c(at)a.com
Теперь, если вы хотите получить средние значения, вы можете свернуть ЭТИ записи и получить среднее значение из DaysDiff.Тем не менее, вы, вероятно, захотите применить WHERE, чтобы удалить «NULL» записи, которые обозначают ПЕРВЫЙ заказ для человека, и просто оставить те, которые специально имели ВТОРОЙ заказ.Вы даже можете применить значения GROUPING для первой даты, последней даты, а также для общего количества заказов.