2017-09-06 76 views
0
+-------+-------+-----------+ 
| EmpID | PerID | VisitDate | 
+-------+-------+-----------+ 
|  1 | 22 | 2/24/2017 | 
|  1 | 22 | 3/25/2017 | 
|  1 | 22 | 4/5/2017 | 
|  2 | 33 | 5/6/2017 | 
|  2 | 33 | 8/9/2017 | 
|  2 | 33 | 6/7/2017 | 
+-------+-------+-----------+ 

我正在嘗試查找每個EmpID的訪問次數和平均訪問日期。對於Avg,我首先必須連續訂購,然後找到平均值。每個組的訂購日期之間的平均天數

例如: EmpID = 1和PerID = 22的天數將是[29(3/25和2/24之間的天數)+11(3/25和4/5之間的天數)/ 2] = 20天。

所需的輸出:

+-------+-------+----------+----------+ 
| EmpID | PerID | MaxVDate | AvgVDays | 
+-------+-------+----------+----------+ 
|  1 | 22 | 4/5/2017 |  20 | 
|  2 | 33 | 8/9/2017 |  47.5 | 
+-------+-------+----------+----------+ 

嘗試:

SELECT 
    EmpID 
    ,PerID 
    ,MAX(VisitDate) AS MaxVDate 
    ,--Dunno how to find average AS AvgVDays 

FROM 
T1 
GROUP BY 
    EmpID 
    ,PerID 

回答

1

下面是一個選項...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 

CREATE TABLE #TestData (
    EmpID INT NOT NULL, 
    PerID INT NOT NULL, 
    VisitDate DATE NOT NULL 
    ); 
INSERT #TestData (EmpID, PerID, VisitDate) VALUES 
    (1, 22, '2/24/2017'), 
    (1, 22, '3/25/2017'), 
    (1, 22, '4/5/2017'), 
    (2, 33, '5/6/2017'), 
    (2, 33, '8/9/2017'), 
    (2, 33, '6/7/2017'); 

-- SELECT * FROM #TestData td; 

SELECT 
    db.EmpID, 
    db.PerID, 
    AvgDays = AVG(db.DaysBetween * 1.0) 
FROM (
    SELECT 
     *, 
     DaysBetween = DATEDIFF(dd, LAG(td.VisitDate, 1) OVER (PARTITION BY td.EmpID, td.PerID ORDER BY td.VisitDate), td.VisitDate) 
    FROM 
     #TestData td 
    ) db 
GROUP BY 
    db.EmpID, 
    db.PerID; 

結果...

EmpID  PerID  AvgDays 
----------- ----------- --------------------------------------- 
1   22   20.000000 
2   33   47.500000 
2

您可以使用lag得到以前的日期和計算日期的差異。然後使用avg窗口函數來獲取平均天數。

Select distinct empid,perid,maxVdate,avg(diff_with_prev) OVER(Partition by empid) as avgVDays 
from (
SELECT EmpID,PerID 
,MAX(VisitDate) OVER(Partition BY EmpID) AS MaxVDate 
,DATEDIFF(DAY,LAG(VisitDate) OVER(Partition BY EmpID order by VisitDate), VisitDate) as diff_with_prev 
FROM T1 
) t 
+0

這似乎給13和31的平均天數爲的EmpID 1和2。不是20和47.5。由於外部的Avg函數在計算中包含0,因此它在平均值中有效地計算超過3而不是2。 – AS91

+0

刪除LAG上的默認VisitDate會爲您的解決方案 – AS91

+0

@ AS91訣竅..你是正確的答案。 –

1

該任務比您想象的要容易得多。您的平均值爲(last visit - first visit)/(count visits - 1)

select 
    empid, 
    perid, 
    max(VisitDate) as MaxVDate, 
    datediff(day, min(VisitDate), max(VisitDate)) * 1.0/(count(*) - 1) as avgvdays 
from mytable 
group by empid, perid 
having count(*) > 1 
order by empid, perid; 

爲避免整數除法,需要乘以1.0。 (你也可以用decimal代替。)

由於計算只對具有多個條目的empid/perid對有意義(爲了避免被零除),我已經應用了一條HAVING條款。

下面是測試:http://rextester.com/AIFPA62612