2011-01-28 4 views
3

Возможно ли найти разницу дней разных записей в SQL Server 2008 R2?TSQL- Поиск разницы в днях нескольких записей в SQL Server

SELECT OrderDate FROM OrdersTbl WHERE SKU='AA0000' ORDER BY ORDERDATE DESC 


OrderDate 
----------------------- 
2009-12-03 00:00:00.000 
2009-04-03 00:00:00.000 
2008-02-22 00:00:00.000 
2008-02-21 00:00:00.000 
2007-02-18 00:00:00.000 
2007-01-27 00:00:00.000 
2006-10-13 00:00:00.000 

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

+0

Какая система базы данных? –

+0

Извините за SQL Server 2008 R2 – pqsk

ответ

5

Вы можете сделать это с общим выражением таблицы и ROW_NUMBER:

WITH OrderDates AS (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY OrderDate DESC) AS RowNumber, 
     OrderDate 
    FROM OrdersTable 
    WHERE SKU = 'AA0000' 
) 
SELECT 
    AVG(DATEDIFF(DD, O2.OrderDate, O1.OrderDate)) AS AverageFrequency 
FROM OrderDates O1 
LEFT JOIN OrderDates O2 
    ON O2.RowNumber = O1.RowNumber + 1 
+0

Красивая, красивая. О, я не мог найти, какое лучшее решение, но да, это то, что мне нужно. Спасибо. :) – pqsk

+0

Рад, что я мог помочь. :) –

1
;With cteDifference as (
    Select SKU, OrderDate, Row_Number() OVER (Partition by SKU Order by OrderDate) as RowNumber 
     from OrdersTbl 
) 
select cur.SKU, 
     cur.OrderDate as CurrentDate, 
     prev.OrderDate as PreviousDate, 
     DATEDIFF(DD,prev.OrderDate, cur.OrderDate) as DaysDifference 
    from cteDifference cur 
     left join cteDifference prev 
      on cur.SKU = prev.SKU 
       and cur.RowNumber = prev.RowNumber + 1 
    where cur.SKU = 'AA0000' 
    order by cur.OrderDate desc 
+0

Это очень полезно, но не полностью. Спасибо хоть. Я очень ценю это. Это действительно помогло мне проверить ответ. – pqsk

+0

@pqsk: Не полный? Вы заявили: «Я бы хотел, чтобы узнать, сколько дней между ними есть для каждой даты заказа». Я считаю, что мой запрос выполняет это требование. –

+0

Если вы продолжаете читать: «... чтобы я мог найти среднюю частоту». Ничего плохого, я просто пошел с полным ответом. Я очень ценю это. Я мог бы лучше переварить это знание. Спасибо. – pqsk

1

Sucks нет LEAD поддержки/LAG в SQL Server:

SELECT z.orderdate, 
     z.prev_date, 
     DATEDIFF(dd, z.prev_date, z.orderdate) 
    FROM (SELECT OrderDate, 
       (SELECT MAX(y.orderdate) 
        FROM ORDERSTBL y 
       WHERE y.orderdate < x.orderdate 
        AND y.sku = x.sku) AS prev_date 
      FROM OrdersTbl x 
     WHERE x.sku ='AA0000') z 
ORDER BY z.orderdate DESC 
+0

Это было очень полезно. Спасибо. – pqsk

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