我有一个表格,我插入页面加载。有趣的领域是入门时间和国家。
如何查询,以便我可以按小时获得最频繁的国家/地区。结果集应如下所示(小时,国家/地区):
......等等。
我开始使用像
这样的东西select DatePart(hour, entrytime) AS h, country from rpageload group by DatePart(hour, entrytime), country
但我认为我的方向是错误的。 ORDER BY和COUNT(*)需要适合某个地方:)
- 已编辑/已添加 -
我发现这种方式给了我正确的结果。但是我显然也得到了很多结果集,而不仅仅是我喜欢的结果集。
DECLARE @count INT
SET @count = 0
WHILE (@count < 24)
BEGIN
SELECT TOP 1 @count AS hr, COUNT(*) AS nbr, country FROM rpageload WHERE DATEPART(hour, entrytime) = @count GROUP BY country ORDER BY nbr DESC
SET @count = (@count + 1)
END
只是澄清:日期或日期并不重要。目的是显示一天中不同时段最常见的国家/地区
答案 0 :(得分:2)
你快到了!
SELECT DatePart(hour, entrytime) AS h, country
FROM rpageload
GROUP BY DatePart(hour, entrytime), country
ORDER BY COUNT(*) DESC
但是,这将结合每小时每一天的条目 因此,昨天下午1-2点将与今天下午1-2点一起计算
如果不希望这样,您需要过滤掉WHERE子句中的其他日期。 或者,按天数分组
编辑:
实际上,我没有正确地阅读这个问题。
SELECT DatePart(hour, entrytime) AS h, country
FROM rpageload rp1
GROUP BY DatePart(hour, entrytime), country
HAVING COUNT(*) =
(SELECT MAX(COUNT(*))
FROM rpageload rp2
WHERE DatePart(rp2.hour, rp2.entrytime) = DatePart(rp1.hour, rp1.entrytime)
GROUP BY DatePart(hour, entrytime), country
)
ORDER BY h
当两个或多个国家/地区具有相同的计数且该时间内的最大值时会发生什么?
可替换地,
WITH RPL1 AS
(
SELECT DatePart(hour, entrytime) AS h, country, COUNT(*) AS cnt
FROM rpageload rp1
GROUP BY DatePart(hour, entrytime), country
),
RPL2 AS
(
SELECT h, MAX(cnt) as maxcnt
FROM RPL1
GROUP BY h
)
SELECT RPL1.h, country
FROM RPL1
JOIN RPL2 ON RPL1.h = RPL2.h AND RPL1.cnt = RPL2.maxcnt
最后两个查询将返回匹配相同最大频率的所有行。因此,同一小时可能会在结果集中出现不止一次。
如果您想过滤掉这些内容,请查看ROW_NUMBER
WITH RPL1 AS
(
SELECT DatePart(hour, entrytime) AS h, country, COUNT(*) AS cnt
FROM rpageload rp1
GROUP BY DatePart(hour, entrytime), country
),
RPL2 AS
(
SELECT h, MAX(cnt) as maxcnt
FROM RPL1
GROUP BY h
),
DUPES AS
(
SELECT RPL1.h, country, cnt, ROW_NUMBER() OVER(PARTITION BY RPL1.h ORDER BY country) AS rn
FROM RPL1
JOIN RPL2 ON RPL1.h = RPL2.h AND RPL1.cnt = RPL2.maxcnt
)
SELECT h, country, cnt
FROM DUPES
WHERE rn = 1