Domanda

Ho una tabella che contiene più record per diverse transazioni cioè.

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

e sto cercando di riassumere i dati in modo da avere i giorni medi per ogni ID e rif ... cioè.

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

Grazie in anticipo se qualcuno può aiutare

È stato utile?

Soluzione

differenza media giorno è un SUM delle differenze divisa per COUNT(*)

SUM delle differenze è la differenza tra la realtà e MIN MAX:

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

Altri suggerimenti

Una cosa come questa ... non proprio sicuro di come queste informazioni vi aiuterà con qualsiasi cosa anche se .... bisogno di maggiori informazioni su ciò che il vostro cercando di mediare giorni per i.

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

Riferimento: AVG , DATEPART

Utilizzo di SQL Server 2005 provare questo.

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

Anche dare un'occhiata a questo matematicamente:

diciamo

([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).

espandere la parte superiore come

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

pagherei finire come -X (0) + X (n)

così abbiamo [X (n) - X (0)] / (n - 1)

in modo da prendere (MAX - MIN) / (Conte - 1) per il conteggio> 1

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top