SQL للعثور على الفرق بين صفوف متعددة
-
18-09-2019 - |
سؤال
لدي جدول يحتوي على سجلات متعددة لمعاملات مختلفة، على سبيل المثال.
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
شكرا مقدما إذا كان أي شخص يمكن أن تساعد
المحلول
متوسط فرق اليوم هو SUM
من الاختلافات مقسمة على COUNT(*)
SUM
من الاختلافات هو في الواقع الفرق بين MIN
و MAX
:
SELECT id, ref, DATEDIFF(day, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0)
FROM mytable
GROUP BY
id, ref
نصائح أخرى
شيء من هذا القبيل...لست متأكدًا حقًا كيف ستساعدك هذه المعلومات في أي شيء بالرغم من ذلك....بحاجة إلى مزيد من المعلومات حول ما تحاول حساب متوسط الأيام له.
SELECT ID, REF, AVG(DATEPART(day, [Date]))
FROM dbo.Table1
GROUP BY ID, REF
مرجع:متوسط, جزء التاريخ
باستخدام 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(ن-2) + X(ن-1) - X(ن-1) + X(ن)
والتي تنتهي كـ -X(0) + X(n)
لذلك لدينا [X(n) - X(0)] / (n - 1)
لذا خذ (MAX - MIN) / (Count - 1) للعدد > 1