2014-04-09 2 views
2

У меня есть таблица со столбцами продукта и проданная дата и вы хотите запросить статистику проданного интервала каждой группы продуктов (максимальный интервал, минимальный интервал ...), есть ли хороший совет, чтобы сделать это, оценить ~Как получить статистику различий по дате по группам с TSQL

Prod SaleDate 
------------------- 
A  2013-02-05 
D  2013-02-24 
B  2013-03-01 
A  2013-03-12 
D  2013-03-22 
A  2013-04-03 
D  2013-04-08 
. . . 

Продан интервал означает дни интервал между двумя соседними датами.

продано интервал A: DATEDIFF (д, '2013-02-05', '2013-03-12') DATEDIFF (д, '2013-03-12', '2013-04-03') ...

Продан интервал D: DATEDIFF (д, '2013-02-24', '2013-03-22') DATEDIFF (д, '2013-03-22', «2013 -04-08 ')


и я хочу получить среднее, максимальное и минимальное значение проданного интервала.

Prod IntervalAvg  IntervalMax IntervalMin 
----------------------------------------------------- 
A  xxx    xxx   xxx 
B  xxx    xxx   xxx 
C 
. . . 
+0

Можете ли вы опубликовать более четкий пример? –

+0

Пример схемы поможет. Я не понимаю, что вы хотите от описания и вывода. Разверните его, чтобы иметь больше строк, чтобы мы могли видеть, что вы хотите. – Stuart

+0

Итак, для каждого продукта вы хотите заказать SaleDates, а затем рассчитать период между каждой парой дат, и этот период является Интервалом, на котором вы хотите сгенерировать min/max/ave? – DeanOC

ответ

2

Благодаря ответ Кана дать мне подсказку. Я повторно реализую свой код для SQL Server 2000 путем «левого внешнего соединения».

DECLARE @DATA TABLE (Prod CHAR(1), SaleDate SMALLDATETIME) 
INSERT INTO @DATA VALUES ('A','2013-02-05') 
INSERT INTO @DATA VALUES ('D','2013-02-24') 
INSERT INTO @DATA VALUES ('B','2013-03-01') 
INSERT INTO @DATA VALUES ('A','2013-03-12') 
INSERT INTO @DATA VALUES ('D','2013-03-22') 
INSERT INTO @DATA VALUES ('A','2013-04-03') 
INSERT INTO @DATA VALUES ('D','2013-04-08') 


SELECT  
t.Prod 
, MAX(t.Interval) IntervalMax 
, MIN(t.Interval) IntervalMin 
, AVG(t.Interval) IntervalAvg 

FROM 
(
    SELECT t1.*, DATEDIFF(dd, MAX(t2.SaleDate), t1.SaleDate) Interval 
    FROM @DATA t1 
    LEFT OUTER JOIN @DATA t2 ON t1.Prod = t2.Prod AND t1.SaleDate > t2.SaleDate 
    GROUP BY t1.Prod, t1.SaleDate 
)t 
GROUP BY t.Prod 
ORDER BY t.Prod 
+0

Мне действительно нравится это лучше, чем у меня. Простота - это всегда хорошо, и у вас действительно все в порядке. :) – Kahn

0

Вот один из способов, который должен работать:

-- Test data 
DECLARE @DATA TABLE (Prod CHAR(1), SaleDate DATE) 
INSERT INTO @DATA VALUES ('A','2013-02-05') 
,('D','2013-02-24') 
,('B','2013-03-01') 
,('A','2013-03-12') 
,('D','2013-03-22') 
,('A','2013-04-03') 
,('D','2013-04-08') 

-- Actual query 
;WITH CTE AS 
    (SELECT D.*, CA.NextSaleDate 
     , DATEDIFF(DD, SaleDate, NextSaleDate) DDiff 
    FROM @DATA D 
    OUTER APPLY (SELECT MIN(SaleDate) NextSaleDate FROM @DATA B WHERE B.Prod = D.Prod AND B.SaleDate > D.SaleDate) CA) 
SELECT DISTINCT Prod, AvgInterval, MaxInterval, MinInterval 
FROM CTE C 
CROSS APPLY (SELECT AVG(DDiff) AvgInterval, MAX(DDiff) MaxInterval, MIN(DDiff) MinInterval FROM CTE B WHERE B.Prod = C.Prod) CA 
+0

Спасибо, что ответили! Выглядит, что я ищу, но есть ли альтернативный способ заменить APPLY на SQL Server 2000. – Cason

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