2014-04-09 92 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 
. . . 

銷售間隔是指相鄰的兩個日期之間的間隔天。 (d,'2013-03-05','2013-03-12') DATEDIFF(d,'2013-03-12','2013-04-03' ) ...

d的已售出的

間隔: DATEDIFF(d, '2013年2月24日', '2013年3月22日') DATEDIFF(d, '2013年3月22日',「2013 -04-08')


我想獲得銷售區間的平均值,最大值和最小值。

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

你能發表一個更清晰的例子嗎? –

+0

示例模式將有所幫助。我不明白你想從描述和輸出中得到什麼。展開它以獲得更多行,以便我們可以看到您想要的內容。 – Stuart

+0

因此,對於每種產品,您要訂購SaleDates,然後計算每對日期之間的時間段,並且該時間段是您想要生成最小/最大/平均時間的時間間隔? – DeanOC

回答

2

由於卡恩的回答給我一個提示。我通過「left outer join」重新實現了我的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

謝謝你的回答!看看我在找什麼,但有什麼替代方法來取代在SQL Server 2000 APPLY。 – Cason