[英]How to get average of earliest datetime per day?
我需要根據他們每天最早的入住時間來計算平均時間。
例如,這些是我簽入的日期時間。
Person | Checkin
-----------------
Jack 2022-01-06 16:42:34.000
Jack 2022-01-06 17:30:34.000
Jack 2022-01-07 10:22:34.000
Jack 2022-01-07 12:12:54.000
Jack 2022-01-08 11:08:53.000
當我想根據最早的入住時間計算我的平均入住時間時,我應該只考慮這些日期時間。
2022-01-06 16:42:34.000
2022-01-07 10:22:34.000
2022-01-08 11:08:53.000
這是我當前的 sql 以獲得平均檢查時間。 但這會考慮上面的所有日期時間並獲得平均時間。
Select Person,(CAST(DATEADD(SS, AVG(CAST(DATEDIFF(SS, '00:00:00', CAST(Checkin AS TIME)) AS BIGINT)), '00:00:00' ) AS TIME)) AS 'AvgCheckInTime' from #Tab_CheckIn
group by Person
我怎樣才能只考慮每天最早的日期時間並獲得平均時間?
這有點亂。
首先,您需要對數據進行分組,以便最早簽到我的一天。 這很簡單,使用CONVERT
到date
和MIN
。
然后你需要得到那些時間的“平均值”。 但是,您無法在 SQL 服務器中平均time
,因為time
表示一天中的時間點而不是時間間隔,因此將它們平均為時間跨度是沒有意義的。 因此,您需要將值“轉換”為數值。
在這種情況下,我使用DATEDIFF
來獲取從午夜到簽入轉換為time
的秒數。 然后我可以平均這些值,最后將它們加到午夜:
WITH Earliest AS(
SELECT Person,
MIN(Checkin) AS EarliestCheckin
FROM dbo.YourTable
GROUP BY Person,
CONVERT(date,Checkin))
SELECT Person,
DATEADD(SECOND,AVG(DATEDIFF(SECOND,'00:00',CONVERT(time,EarliestCheckin))),CONVERT(time,'00:00')) AS AverageCheckin
FROM Earliest
GROUP BY Person;
假設你得到想要的結果(除了過濾不想要的日期)
Select t.Person,(CAST(DATEADD(SS, AVG(CAST(DATEDIFF(SS, '00:00:00', CAST(t.Checkin AS TIME)) AS BIGINT)), '00:00:00' ) AS TIME)) AS 'AvgCheckInTime'
from (SELECT Person, min(Checkin) as Checkin FROM #Tab_CheckIn
GROUP BY Person, cast(Checkin As Date)) t
group by t.Person
SELECT Person,(CAST(DATEADD(SS, AVG(CAST(DATEDIFF(SS, '00:00:00', CAST(Checkin AS TIME)) AS BIGINT)), '00:00:00' ) AS TIME)) AS 'AvgCheckInTime'
from (
SELECT person, checkin, row_number() over(PARTITION by person, CAST(checkin as DATE) order by checkin asc) as row
FROM #Tab_CheckIn) as p
where p.row =1
group by p.person
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.