Ты почти у цели!
SELECT DatePart(hour, entrytime) AS h, country
FROM rpageload
GROUP BY DatePart(hour, entrytime), country
ORDER BY COUNT(*) DESC
Тем не менее, это будет объединять записи из каждого дня в час
Таким образом, вчерашний день с 14:00 до 14:00 будет подсчитан вместе с сегодняшним днем с 12:00.
Если это нежелательно, вам нужно отфильтровать другие дни в предложении WHERE.
Кроме того, группа по дням в верхней части часов
Edit:
На самом деле, я не правильно прочитал вопрос.
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