TSQL: не Может выполнить агрегатную функцию AVG на КОЛИЧЕСТВЕ (*) для нахождения самых напряженных часов дня

Что действительно 'объясняет', говорят? (выполненный ОБЪЯСНЯЮТ ВЫБОР * ОТ transactionlist, где дата (TranDateTime) = '2008-08-17')

, Если это не использует Ваш индекс из-за даты () функция, запрос диапазона, должен работать быстро:

ВЫБОР * ОТ transactionlist, где TranDateTime> = '2008-08-17' И TranDateTime < '2008-08-18'

5
задан OMG Ponies 25 February 2010 в 18:44
поделиться

2 ответа

Использование inline view:

SELECT DATEPART(hh, x.visitdate),
       AVG(x.num)
  FROM (SELECT t.visitdate,
               COUNT(*) 'num'
          FROM CUSTOMERLOG t
         WHERE t.visitdate BETWEEN 'Jan 1 2009' AND 'Aug 1 2009'
      GROUP BY t.visitdate) x
GROUP BY DATEPART(hh, x.visitdate)

Использование эквивалента CTE (SQL Server 2005+):

WITH visits AS (
   SELECT t.visitdate,
          COUNT(*) 'num'
     FROM CUSTOMERLOG t
    WHERE t.visitdate BETWEEN 'Jan 1 2009' AND 'Aug 1 2009'
 GROUP BY t.visitdate)
   SELECT DATEPART(hh, x.visitdate),
         AVG(x.num)
    FROM visits x
GROUP BY DATEPART(hh, x.visitdate)
7
ответ дан 14 December 2019 в 08:53
поделиться

Количество дней известно и равно РАЗНДАТ (день, ПРЕОБРАЗОВАТЬ (ДАТАВРЕМЯ, '2009.01.01', 120), ПРЕОБРАЗОВАТЬ (ДАТАВРЕМЯ, '2009.09.01' , 120)) . Вы должны вычислить сумму и разделить ее на количество дней в выбранном диапазоне:

SELECT  
  DATEPART(hh, VisitDate),
  CAST(COUNT(*) AS FLOAT) / DATEDIFF(day,CONVERT(DATETIME,'2009.01.01',120),CONVERT(DATETIME,'2009.09.01',120))
FROM CustomerLog
WHERE 
  (VisitDate >= CONVERT(DATETIME,'2009.01.01',120)) AND 
  (VisitDate < CONVERT(DATETIME,'2009.09.01',120))  
GROUP BY DATEPART(hh, VisitDate)

CAST (COUNT (*) AS FLOAT) , чтобы получить более точный результат, но вы можете оставить только COUNT (*) и иметь целочисленный результат.

Если вы используете параметры, это будет:

SELECT  
  DATEPART(hh, VisitDate),
  CAST(COUNT(*) AS FLOAT) / DATEDIFF(day,@beginningDate,@endDate)
FROM CustomerLog
WHERE 
  (VisitDate >= @beginningDate) AND 
  (VisitDate < @endDate)  
GROUP BY DATEPART(hh, VisitDate)

Если вы хотите получить результаты за январь, вы должны использовать @beginningDate = '2009.01.01', @endDate = '2009.02.01' .

0
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: