SQL查找多行之间的差异

时间:2009-07-21 12:30:10

标签: sql difference-between-rows

我有一个包含不同交易的多个记录的表,即

ID  Date         REF
1   01/09/2008   A
1   11/09/2008   A
1   01/10/2008   A
2   01/09/2008   A
2   01/10/2008   A
2   01/11/2008   B
2   01/12/2008   B

我想总结数据,以便我得到每个id和ref的平均天数... 即。

ID  Ref    Avg_Days
1   A      15
2   A      30
2   B      30

如果有人可以提供帮助,请提前致谢

3 个答案:

答案 0 :(得分:3)

这样的事情......不太确定这些信息如何帮助你做任何事情....需要更多关于你想要平均日期的信息。

SELECT ID, REF, AVG(DATEPART(day, [Date]))
FROM dbo.Table1
GROUP BY ID, REF

参考: AVGDATEPART

答案 1 :(得分:3)

平均差异为SUM差异除以COUNT(*)

SUM差异实际上是MINMAX之间的差异:

SELECT  id, ref, DATEDIFF(day, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0)
FROM    mytable
GROUP BY
        id, ref

答案 2 :(得分:3)

使用sql server 2005试试这个。

DECLARE @Table TABLE(
        ID INT,
        Date DATETIME,
        Ref VARCHAR(MAX)
)

INSERT INTO @Table (ID,Date,Ref) SELECT 1, '01 Sep 2008', 'A'
INSERT INTO @Table (ID,Date,Ref) SELECT 1, '11 Sep 2008', 'A'
INSERT INTO @Table (ID,Date,Ref) SELECT 1, '01 Oct 2008', 'A'
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Sep 2008', 'A'
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Oct 2008', 'A'
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Nov 2008', 'B'
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Dec 2008', 'B'


;WITH Ordered AS (
    SELECT  ID,
            Ref,
            Date,
            ROW_NUMBER() OVER (PARTITION BY ID, Ref  ORDER BY Date) SubNumber
    FROM    @Table t
)
SELECT  Ordered.ID,
        Ordered.Ref,
        AVG(DATEDIFF(dd, Ordered.Date, OrderedNext.Date)) AVG_Days
FROM    Ordered INNER JOIN
        Ordered OrderedNext ON  Ordered.ID = OrderedNext.ID
                            AND Ordered.Ref = OrderedNext.Ref
                            AND Ordered.SubNumber + 1 = OrderedNext.SubNumber
GROUP BY Ordered.ID,
        Ordered.Ref

还要以数学方式看一下:

让我们说

([X(1)-X(0)] + [X(2)-X(1)] + [X(3)-X(2)] + ... + [X(n-1) )-X(n-2)] + [X(n)-X(n-1)])/(n-1)。

将顶部展开为

-X(0)+ X(1) - X(1)+ X(2) - X(2)+ X(3) - ...... - X(n-2)+ X(n-1 ) - X(n-1)+ X(n)

whcih最终为-X(0)+ X(n)

所以我们有[X(n) - X(0)] /(n - 1)

所以取(MAX - MIN)/(Count - 1)计数> 1