我被要求查看記錄用戶登錄和註銷活動的數據庫 - 有一個用於登錄時間的列,然後是用於記錄註銷的另一列,均爲OLE格式。我需要彙總一些關於用戶併發性的信息 - 即每天有多少用戶同時登錄。SQL Server中'重疊'行的計數
有誰知道如何在SQL中做到這一點?我真的不需要知道細節,只需每天計數。
在此先感謝。
我被要求查看記錄用戶登錄和註銷活動的數據庫 - 有一個用於登錄時間的列,然後是用於記錄註銷的另一列,均爲OLE格式。我需要彙總一些關於用戶併發性的信息 - 即每天有多少用戶同時登錄。SQL Server中'重疊'行的計數
有誰知道如何在SQL中做到這一點?我真的不需要知道細節,只需每天計數。
在此先感謝。
我認爲這會起作用。
Select C.Day, Max(C.Concurrency) as MostConcurrentUsersByDay
FROM
(
SELECT convert(varchar(10),L1.StartTime,101) as day, count(*) as Concurrency
FROM login_table L1
INNER JOIN login_table L2
ON (L2.StartTime>=L1.StartTime AND L2.StartTime<=L1.EndTime) OR
(L2.EndTime>=L1.StartTime AND L2.EndTime<=L1.EndTime)
WHERE (L1.EndTime is not null) and L2.EndTime Is not null) AND (L1.ID<>L2.ID)
GROUP BY convert(varchar(10),L1.StartTime,101)
) as C
Group BY C.Day
最簡單的方法是使從輔助號碼錶times_table(通過從0到24 * 60分鐘,然後加入到基準時間),以獲得在一定的24小時內每次:
SELECT MAX(simul) FROM (
SELECT test_time
,COUNT(*) AS simul
FROM your_login_table
INNER JOIN times_table -- a table/view/subquery of all times during the day
ON your_login_table.login_time <= times_table.test_time AND times_table.test_time <= your_login_table.logout_time
GROUP BY test_time
) AS simul_users (test_time, simul)
未檢查......但失去日期值,計算之間的時間,用「一天結束」中仍然記錄。
這是假定「logintime」是一個日期和時間。如果沒有,派生表可以被刪除(儘管如此,仍然需要ISNULL)。當然,SQL Server 2008也有「時間」來讓這更容易。
SELECT
COUNT(*)
FROM
(
SELECT
DATEADD(day, DATEDIFF(day, logintime, 0), logintime) AS inTimeOnly,
ISNULL(DATEADD(day, DATEDIFF(day, logouttime, 0), logintime), '1900-01-01 23:59:59.997') AS outTimeOnly
FROM
mytable
) foo
WHERE
inTimeOnly >= @TheTimeOnly AND outTimeOnly <= @TheTimeOnly
謝謝 - 我不得不稍微調整它(通過添加一個GROUP BY到內部選擇結束),但它似乎完成了這項工作。 – KenD 2010-03-03 13:29:50
對不起,把它寫在我頭上,沒有仔細檢查。我加了一組來回答。 – JohnFx 2010-03-03 16:59:01