GROUP BY
- это путь.
Я бы просто сделал CTE
для каждого временного интервала, который вам нужен, и выбрал бы максимум для каждого:
;WITH CTEMinute AS
(
SELECT YEAR(datefield) yr,
MONTH(datefield) mo,
DAY(datefield) d,
DATEPART(hour, datefield) hr,
DATEPART(minute, datefield) Mint,
COUNT(*) as 'Inserts'
FROM MyTable
GROUP BY YEAR(datefield),
MONTH(datefield),
DAY(datefield),
DATEPART(hour, datefield),
DATEPART(minute, datefield)
)
,CTESecond AS
(
SELECT YEAR(datefield) yr,
MONTH(datefield) mo,
DAY(datefield) d,
DATEPART(hour, datefield) hr,
DATEPART(minute, datefield) Mint,
DATEPART(second, datefield) sec,
COUNT(*) as 'Inserts'
FROM MyTable
GROUP BY YEAR(datefield),
MONTH(datefield),
DAY(datefield),
DATEPART(hour, datefield),
DATEPART(minute, datefield),
DATEPART(second, datefield)
)
Затем вы можете просто выбрать из этих CTE
s, чтобы получить значения max / min / avg за единицу времени.
Если вы хотите, чтобы он был более элегантным, вы потенциально можете просто сделать на CTE
столько тонкости, сколько вы, вероятно, захотите (то есть, миллисекунды или что-то еще), и тогда вы можете SELECT
/ GROUP BY
это.
Проблема с этим заключается в том, что CTE
не очень хорошо работают, так как они в основном одноразовые представления без индексов или чего-либо еще, поэтому объединение CTE в другом запросе быстро приведет к неудаче.