Запрос SQL Server, самый частый за час - PullRequest
1 голос
/ 01 ноября 2011

У меня есть таблица, куда я вставляю загрузки страниц.Интересными полями являются время входа и страна.

Как запросить информацию, чтобы я мог получить наиболее частую страну по часам.Набор результатов должен выглядеть следующим образом (Час, Страна):

  • 01 - США
  • 02 - Сингапур
  • 03 - Индия
  • 04- Дания

... и т. Д.

Я начинал с чего-то вроде

select DatePart(hour, entrytime) AS h, country from rpageload group by DatePart(hour, entrytime), country

, но думаю, что я иду в неправильном направлении,ORDER BY и COUNT (*) должны где-то вписываться:)

- EDITED / ADDED -

Я обнаружил, что этот вид дает мне правильные результаты.Но я, очевидно, также получаю множество наборов результатов, а не только один, как мне хотелось бы.

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 Ответ

2 голосов
/ 01 ноября 2011

Ты почти у цели!

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...