SQL Um Unterschied zwischen mehreren Reihen
-
18-09-2019 - |
Frage
Ich habe eine Tabelle mehrere Datensätze für unterschiedliche Transaktionen d.h enthalten.
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
, und ich suche die Daten zusammenzufassen, damit ich die durchschnittliche Anzahl Tage für jede ID und ref haben ... d.
ID Ref Avg_Days
1 A 15
2 A 30
2 B 30
Vielen Dank im Voraus, wenn jemand helfen kann
Lösung
Durchschnittlicher Tag Unterschied ist ein SUM
von Differenzen durch COUNT(*)
geteilt
SUM
die Unterschiede ist in der Tat Unterschied zwischen MIN
und MAX
:
SELECT id, ref, DATEDIFF(day, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0)
FROM mytable
GROUP BY
id, ref
Andere Tipps
Mit SQL Server 2005 versuchen dies.
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
Haben Sie auch einen Blick auf sie mathematisch:
Lassen Sie uns sagen,
([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).
erweitern Sie den oberen Teil als
-X (0) + X (1) - X (1) + X (2) - X (2) + X (3) - ... - X (n-2) + X (n-1 ) - X (n-1) + X (n)
Whcih als -X Ende (0) + X (n)
so haben wir [X (n) - X (0)] / (n - 1)
so nehmen (MAX - MIN) / (Count - 1) für count> 1