2013-08-16 3 views
0

Так у меня есть таблица в базе данных со следующими полями:Время с момента последнего покупки

  • Transaction ID
  • ID клиента
  • Transaction Дата

Я хочу, чтобы добавить дополнительный поле к таблице под названием

  • Время с Previou s Транзакция для каждого клиента

Это должно быть просто (дата транзакции A - дата транзакции B) при условии, что клиенты являются одинаковыми, а таблица упорядочена по дате.

Я использую mySQL (так что Oracle Advances PL/SQL не имеет). В моей таблице много строк.

выберите txn_id, cust_id, txn_date from txns;

Как это сделать?

+0

Вы хотите автоматическое вычисление поля или просто инициализировать значения один раз? – Vatev

+0

Я строю таблицу анализа, поэтому инициализирую только один раз. – eamo

ответ

1

Я думаю, что это легче всего сделать с помощью связанного подзапроса:

select t.*, 
     datediff((select t2.TransactionDate 
       from t t2 
       where t2.CustomerId = t.CustomerId and 
         t2.TransactionDate < t.TransactionDate 
       order by t2.TransactionDate desc 
       limit 1 
       ), t.TransactionDate) as daysSinceLastPurchase 
from t; 

Это делает предположение о том, что сделки происходят в разные дни.

Если это предположение не верно и идентификаторы транзакций в порядке возрастания, вы можете использовать:

select t.*, 
     datediff((select t2.TransactionDate 
       from t t2 
       where t2.CustomerId = t.CustomerId and 
         t2.TransactionId < t.TransactionId 
       order by t2.TransactionId desc 
       limit 1 
       ), t.TransactionDate) as daysSinceLastPurchase 
from t; 
0

Незначительные вариации на коррелированных тему суб-запроса:

SELECT t1.*, 
    datediff(t1.tdate, 
      (select MAX(t2.tdate) from trans AS t2 
       where t1.cid = t2.cid and t2.tdate < t1.tdate 
      ) 
      ) AS 'delta' 
FROM trans AS t1; 

См http://sqlfiddle.com/#!2/4c5f2/5

Смежные вопросы