如何使用TSQL按组获取日期差异统计信息

如何使用TSQL按组获取日期差异统计信息,sql,sql-server,tsql,sql-server-2000,Sql,Sql Server,Tsql,Sql Server 2000,我有一个包含产品和销售日期列的表,想查询每个产品组的销售间隔统计数据(最大间隔、最小间隔…),有什么好的建议吗,谢谢~ 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 . . . 销售间隔指两个相邻日期

我有一个包含产品和销售日期列的表,想查询每个产品组的销售间隔统计数据(最大间隔、最小间隔…),有什么好的建议吗,谢谢~

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的销售间隔: 日期差异(d,'2013-02-05','2013-03-12') 日期差异(d,'2013-03-12','2013-04-03')

D的销售间隔: 日期差异(d,'2013-02-24','2013-03-22') 日期差异(d,'2013-03-22','2013-04-08')


我想得到销售区间的平均值,最大值和最小值

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

以下是一种可行的方法:

-- 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

谢谢卡恩的回答给我一个提示。我通过“左外连接”重新实现了sql server 2000的代码


你能给出一个更清晰的例子吗?示例模式会有所帮助。我不明白你想从描述和输出中得到什么。将其展开以有更多行,这样我们可以看到您想要的内容。因此,对于每个产品,您希望订购SaleDates,然后计算每对日期之间的周期,该周期是您希望生成最小/最大/平均值的时间间隔?是的,@DeanOC。谢谢你的解释,谢谢你的回答!看起来和我想要的一样,但是有没有替代的方法来取代sql server 2000上的APPLY。实际上,我更喜欢这个。简单总是一件好事,你的想法是对的
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