2016-12-21 4 views
0

Я хочу рассчитать разницу в день между первым посещением и вторым посещением; второй визит и третьи посещения и т. д. для каждого клиента, использующего SQL. Пожалуйста помогите.Как рассчитать разницу дат между разными посещениями с помощью SQL

Например, клиент посетил три раза по 2016-01-03, 2016-01-06 и 2016-05-30, в то время как клиент Б посетил десять раз с разными датами.

Запрос

With cte as (Select customerid, VisitDate, 
        ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY VisitDate) as rownum 
      FROM visitTable V) 
Select CustomerID, VisitDate, rownum, DateDiff(D,R1.VisitDate, R2.VisitDate) as NoOfDays 
FROM cte R1 
LEFT JOIN cte R2 ON R1.CustomerID = R2.CustomerID AND R1.rownum = 1 AND R2.rownum = 2 

Спасибо

+3

Какие СУБД? SQL Server? MySQL? Oracle? Что-то другое? Кроме того, какова структура вашей таблицы? [Помогите нам помочь.] (Https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) – Siyual

+0

Пожалуйста, покажите нам, что у вас есть. пытался. –

+0

вы можете вычитать даты друг от друга - это приводит к (дробному) количеству дней. – Randy

ответ

1

Я думаю, что вы были очень близки к правой идее. Вашему соединению необходимо сравнить номера строк. Я также переключил порядок вашей даты diff, но я не тестировал его.

With cte as (
     Select customerid, VisitDate, 
       ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY VisitDate) as rownum 
     FROM visitTable V 
) 
Select R1.CustomerID, R1.VisitDate, R1.rownum, 
     DateDiff(D,R2.VisitDate, R1.VisitDate) as NoOfDays --this is days since last visit 
FROM cte R1 --current row 
LEFT JOIN cte R2 --previous visit - will result in null days for 1st row. 
     ON R1.CustomerID = R2.CustomerID 
     AND R1.rownum - 1 = R2.rownum 
order by R1.CustomerID, R1.VisitDate;