여러 행 사이의 차이를 찾는 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의 평균 일을 갖도록 데이터를 요약하고자합니다 ... 즉
ID Ref Avg_Days
1 A 15
2 A 30
2 B 30
누군가 도울 수 있다면 미리 감사드립니다
해결책
평균 일 차이는 a입니다 SUM
차이가 나뉘어져 있습니다 COUNT(*)
SUM
차이는 실제로 차이입니다 MIN
그리고 MAX
:
SELECT id, ref, DATEDIFF(day, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0)
FROM mytable
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 (n -2) + x (n -1) - x (N-1) + X (N)
whcih는 -x (0) + x (n)로 끝납니다.
그래서 우리는 [x (n) -x (0)] / (n -1)을 가지고 있습니다.
Count> 1의 경우 (Max -Min) / (Count -1)를 가져 가십시오.
제휴하지 않습니다 StackOverflow