SQL Server查询,最常见于小时

时间:2011-11-01 04:07:50

标签: sql sql-server-2005 select group-by

我有一个表格,我插入页面加载。有趣的领域是入门时间和国家。

如何查询,以便我可以按小时获得最频繁的国家/地区。结果集应如下所示(小时,国家/地区):

  • 01 - 美国
  • 02 - 新加坡
  • 03 - 印度
  • 04 - 丹麦

......等等。

我开始使用像

这样的东西
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

只是澄清:日期或日期并不重要。目的是显示一天中不同时段最常见的国家/地区

1 个答案:

答案 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