SQL Per trovare differenza tra le file multiple
-
18-09-2019 - |
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
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
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