Группировка и подведение итогов столбцов - PullRequest
1 голос
/ 18 июня 2011

С учетом приведенных ниже таблиц, каков наилучший подход (в обоих вариантах сервера):

Сгруппировать все строки в течение минуты / часа / дня и получить максимальный столбец "CounterC"?

Пример: Между «сейчас» и «сейчас» - 1 день, получите Макс (CounterC) за каждый час.Пример 2: Между «сейчас» и «сейчас» - 30 дней, получите Max (CounterC) для каждого дня.

Очевидно, что строки должны быть сгруппированы, но как?

MS SQL

CREATE TABLE [dbo].[DE0000000D102D1D](
[index] [bigint] IDENTITY(1,1) NOT NULL,
[TimeStamp] [datetime] NOT NULL,
[CounterA] [bigint] NOT NULL,
[CounterB] [bigint] NOT NULL,
[CounterC] [bigint] NOT NULL,
[CounterD] [bigint] NOT NULL,
)

MySQL

CREATE TABLE `de0000000d102d1d` (
 `index` bigint(20) NOT NULL AUTO_INCREMENT,
 `TimeStamp` datetime NOT NULL,
 `CounterA` bigint(20) NOT NULL,
 `CounterB` bigint(20) NOT NULL,
 `CounterC` bigint(20) NOT NULL,
 `CounterD` bigint(20) NOT NULL,
 PRIMARY KEY (`index`)
)

Некоторые примеры данных:

index  TimeStamp                CounterA  CounterB  CounterC   CounterD
-----  -----------------------  --------  --------  ---------  --------
1      2011-03-07 14:25:32.000  0         1         347406352  916
2      2011-03-07 14:26:32.000  0         1         347407169  916
3      2011-03-07 14:27:32.000  0         1         347407978  916
4      2011-03-07 14:28:31.000  0         1         347408617  916
5      2011-03-07 14:29:31.000  0         1         347409087  916
6      2011-03-07 14:30:30.000  0         1         347409557  916
7      2011-03-07 14:31:09.000  0         1         347409845  916

Заранее спасибо!

Редактировать: Это на самом деле Макс (CounterC) Iхочу за каждый интервал, а не сумму.

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Для SQL Server

-- Last 30 days grouped by day
select dateadd(day, datediff(day, 0, D.[TimeStamp]), 0) as [day], 
       max(D.CounterC) as MaxC
from DE0000000D102D1D as D
where D.[TimeStamp] between dateadd(d, -30, getdate()) and getdate()
group by dateadd(day, datediff(day, 0, D.[TimeStamp]), 0)

-- Last day grouped by the hour
select dateadd(hour, datediff(hour, 0, D.[TimeStamp]), 0) as [Hour], 
       max(D.CounterC) as MaxC
from DE0000000D102D1D as D
where D.[TimeStamp] between dateadd(d, -1, getdate()) and getdate()
group by dateadd(hour, datediff(hour, 0, D.[TimeStamp]), 0)
0 голосов
/ 19 июня 2011

А для MySQL вот те же запросы:

-- Last 30 days grouped by day
select date_format( timestamp,'%Y:%m:%d' ) `day`, max(D.CounterC) as MaxC
from `DE0000000D102D1D` as D
where D.`TimeStamp` between timestampadd(day, -30, now()) and now()
group by date_format( timestamp,'%Y:%m:%d' )
order by `day` ASC;

-- Last day grouped by the hour
select date_format( timestamp,'%Y:%m:%d %H' ) as `Hour`, max(D.CounterC) as MaxC
from `DE0000000D102D1D` as D
where D.`TimeStamp` between timestampadd(day, -1, now()) and now()
group by date_format( timestamp,'%Y:%m:%d %H' )
order by `Hour` ASC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...