2013-09-10 3 views
0

Рассмотрим таблицу под названием «Вызовы», что помимо всего прочего, содержит следующие столбцы:Получить час с самым высоким количество строк

CalledNumber | CallBegin 
----------------------------------- 
004401151234567|10/08/2013 09:06:53 
004303111238493|15/09/2013 14:56:29 

и так далее ...

Как бы один идти о выборе в течение часа, который усреднен по диапазону дат, содержит наибольшее количество строк? Цель состоит в том, чтобы найти «Занятый час» для каждого квартала в год. SQL действительно не является моей сильной стороной, и я смотрю на манипуляции до 9.6 миллионов строк порой, хотя время выполнения не является ключевой проблемой.

+1

группы по часовой части даты (и год, месяц, день OFC.), Граф() calledNumbers, и вид соответственно. – dognose

+1

Сохраняется ли 'CallBegin' как дата? Это не стандартный формат для дат SQL, поэтому я хотел уточнить. –

+0

@DavidStarkey это на самом деле хранится как DateTime, видимо, длинный день взял на себя мой старый мозг ... – Ahhhhbisto

ответ

3

DATEPART является то, что вы ищете:

SELECT 
    DATEPART(hour, CallBegin), COUNT(*) as NumberOfCalls 
FROM 
    Test 
WHERE 
    CallBegin BETWEEN '2013-01-01' AND '2013-12-31' 
GROUP BY 
    DATEPART(hour, CallBegin) 
ORDER BY 
    NumberOfCalls DESC 

Работа DEMO

+0

А это фантастика. Извините за недостаток знаний SQL, и спасибо за это! – Ahhhhbisto

0

Вы можете использовать DATEPART() и CONVERT(), я предполагаю, что CallBegin не хранится в DateTime:

SELECT YEAR(CONVERT(DATETIME,CallBegin,103))'Year' 
     , DATEPART(quarter,CONVERT(DATETIME,CallBegin,103))'Quarter' 
     , DATEPART(hour,CONVERT(DATETIME,CallBegin,103))'Hour' 
     , COUNT(*) 
FROM Calls 
GROUP BY YEAR(CONVERT(DATETIME,CallBegin,103)) 
     , DATEPART(quarter,CONVERT(DATETIME,CallBegin,103)) 
     , DATEPART(hour,CONVERT(DATETIME,CallBegin,103)) 

Если вы хотите охватить годы, просто исключите часть года:

SELECT DATEPART(quarter,CONVERT(DATETIME,CallBegin,103))'Quarter' 
     , DATEPART(hour,CONVERT(DATETIME,CallBegin,103))'Hour' 
     , COUNT(*) 
FROM Calls 
GROUP BY DATEPART(quarter,CONVERT(DATETIME,CallBegin,103)) 
     , DATEPART(hour,CONVERT(DATETIME,CallBegin,103)) 
0

Использование DATEPART. Т.е.,

SELECT DATEPART(hh, CallBegin) , 
    COUNT(1) as callCount 
FROM Calls 
GROUP BY DATEPART(hh, CallBegin) 
ORDER BY callCount DESC 
0

Вместо datePart, попробуйте использовать DateAdd() и DateDiff()

Select top 1 DateAdd(hour, DateDiff(hour, 0, CallBegin), 0) 
    From Calls 
    Group By DateAdd(hour, DateDiff(hour, 0, CallBegin), 0) 
    Order By Count(*) Desc 

Это будет работать лучше, потому что это чисто арифметический, то есть, нет никакого разбора текстовых представлений даты и/или DateTimes ,

Добавить счетчик, чтобы увидеть, сколько произошло в течение этого часа

Select top 1 DateAdd(hour, DateDiff(hour, 0, CallBegin), 0), Count(*) 
    From Calls 
    Group By DateAdd(hour, DateDiff(hour, 0, CallBegin), 0) 
    Order By Count(*) Desc 
Смежные вопросы