【问题标题】:How to get date difference statistics by group with TSQL如何使用 TSQL 按组获取日期差异统计信息
【发布时间】:2014-05-22 01:37:22
【问题描述】:

我有一个产品和销售日期列的表格,想查询每个产品组的销售间隔(最大间隔,最小间隔......)的统计信息,有没有好的建议,不胜感激~

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(d, '2013-02-05', '2013-03-12') DATEDIFF(d, '2013-03-12', '2013-04-03') ...

D的卖出区间: DATEDIFF(d, '2013-02-24', '2013-03-22') DATEDIFF(d, '2013-03-22', '2013-04-08')


我想获得已售出区间的平均值、最大值和最小值。

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

【问题讨论】:

  • 你能发布一个更清晰的例子吗?
  • 示例架构会有所帮助。我不明白你想要从描述和输出中得到什么。展开它以获得更多行,以便我们看到您想要的内容。
  • 因此,对于每个产品,您要订购 SaleDates,然后计算每对日期之间的时间段,而该时间段是您要生成 min/max/ave 的 Interval?
  • 是的,@DeanOC。感谢您的解释。

标签: sql sql-server tsql sql-server-2000


【解决方案1】:

感谢卡恩的回答给我一个提示。我通过“左外连接”重新实现了我的 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

【讨论】:

  • 我实际上比我自己更喜欢这个。简单总是一件好事,而你的确实是对的。 :)
【解决方案2】:

这是一种可行的方法:

-- 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 上的 APPLY。
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2018-12-15
  • 2021-11-03
相关资源
最近更新 更多