SQL Чтобы найти разницу между несколькими строками - PullRequest
3 голосов
/ 21 июля 2009

У меня есть таблица, содержащая несколько записей для разных транзакций, т.е.

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    Avg_Days
1   A      15
2   A      30
2   B      30

Заранее спасибо, если кто-нибудь может помочь

Ответы [ 3 ]

3 голосов
/ 21 июля 2009

Средняя дневная разница составляет SUM разниц, деленных на COUNT(*)

SUM различий фактически является разницей между MIN и MAX:

SELECT  id, ref, DATEDIFF(day, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0)
FROM    mytable
GROUP BY
        id, ref
3 голосов
/ 21 июля 2009

Используя 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)

, которые в конечном итоге получат -X (0) + X (n)

поэтому у нас есть [X (n) - X (0)] / (n - 1)

поэтому возьмите (MAX - MIN) / (Count - 1) для счета> 1

3 голосов
/ 21 июля 2009

Примерно так ... не совсем уверен, как эта информация поможет вам в чем-то, хотя .... нужна дополнительная информация о том, для чего вы пытаетесь усреднить дни.

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

Ссылка: AVG , DATEPART

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...