سؤال

لدي جدول يحتوي على سجلات متعددة لمعاملات مختلفة، على سبيل المثال.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top