2009-08-11 85 views
1

我在SQL Server中有一个表格,由两列组成,它们跟踪有多少用户以特定间隔登录系统。第一列是Time15,它是四舍五入到最接近的15分钟间隔(日期时间)的时间。第二列是UserCount,它是在15分钟间隔内登录到系统的用户数量。T-SQL查询 - GROUP BY问题

我需要一个查询,它会显示每天登录用户的高峰数量。因此,如果在下午1点在09年1月1日系统达到100个用户的高峰期,我需要输出,看起来像:

09年1月1日 - 100

09年1月2日 - 94

09年1月3日 - 98

等等

任何想法,T-SQL是要做到这一点?谢谢!

回答

5

试试这个:

SELECT YEAR(Time15), MONTH(Time15), DAY(Time15), MAX(UserCount) 
FROM Table 
GROUP BY YEAR(Time15), MONTH(Time15), DAY(Time15) 

我喜欢罗斯的为摆脱时间部分的做法 - 如果你有SQL服务器2005+就可以使用这种方法来保持一天的高峰发生的时间:

WITH cte AS 
(
SELECT Time15, UserCount, ROW_NUMBER() OVER (PARTITION BY DATEADD(dd, DATEDIFF(d, 0, Time15), 0) ORDER BY UserCount DESC) AS RowNumber 
FROM <Table> 
) 
SELECT Time15, UserCount 
FROM cte 
WHERE RowNumber = 1 
+0

如果你想得到峰值#,不应该是“MAX(UserCount)”而不是“SUM”吗? – David 2009-08-11 20:00:59

+0

应该不是MAX()? – devio 2009-08-11 20:01:32

+0

正确 - 应该是MAX(已编辑) – 2009-08-11 20:07:35

2

您基本上需要从Time15字段中删除时间部分以获取日期。然后,只有当您按日期进行分组时,才能获得最大用户数的简单情况。

SELECT 
    DATEADD(dd, DATEDIFF(d, 0, Time15), 0) As [Date], 
    MAX(UserCount) As [Maximum Users] 
FROM 
    Table 
GROUP BY 
    DATEADD(dd, DATEDIFF(d, 0, Time15), 0) 
1

我只是把它转换这样......似乎是最简单的..

选择Convert(VARCHAR,Time15,101)作为DA,最大(USERCOUNT位)FROM TABLE GROUP BY转换(varchar,Time15,101)