2015-06-25 4 views
0

Таблица InterfaceTraffic_detail (от Solarwinds SQL Server) в основном имеет структуру таблицы:MS SQL Server группа макс

CREATE TABLE [dbo].[InterfaceTraffic_Detail](
    [InterfaceID] [int] NOT NULL, 
    [DateTime] [datetime] NOT NULL, 
    [In_Maxbps] [real] NULL, 
    [Out_Maxbps] [real] NULL 
CONSTRAINT [PK_InterfaceTraffic_Detail] PRIMARY KEY CLUSTERED 
(
    [InterfaceID] ASC, 
    [DateTime] ASC, 
    [Archive] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

данных:

InterfaceID Out_Maxbps In_Maxbps DateTime 
------------|-----------|------------|-------------------------| 
1   | 10  | 10   | 2015-06-23 01:03 
1   | 11  | 11   | 2015-06-23 01:08 
2   | 12  | 12   | 2015-06-23 01:05 
2   | 10  | 10   | 2015-06-23 01:10 

Как я могу group byInterfaceID?

select 
    max(Out_Maxbps) over (partition by itt.InterfaceID), 
    avg(Out_Maxbps) over (partition by itt.InterfaceID), 
    max(In_Maxbps) over (partition by itt.InterfaceID), 
    avg(In_Maxbps) over (partition by itt.InterfaceID), 
    itt.InterfaceID, 
    itt.datetime 
from InterfaceTraffic_detail as itt with (nolock) 
where (itt.DateTime >= '2015-06-23 01:00:00' 
    and itt.DateTime <= '2015-06-23 05:00:00' 
    and (itt.InterfaceID = 489108 or itt.InterfaceID = 489109 or itt.InterfaceID = 1220996)) 
group by itt.InterfaceID 
order by itt.InterfaceID asc; 

я получаю сообщение об ошибке:

Column 'InterfaceTraffic_detail.Out_Maxbps' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

+1

Каков ваш ожидаемый результат? –

ответ

2

Вы можете обернуть его в КТР и использовать ROW_NUMBER взять только один ряд для каждой группы:

WITH CTE AS 
(
    select 
     MaxOutBPS = max(Out_Maxbps) over (partition by itt.InterfaceID), 
     AvgOutBPS = avg(Out_Maxbps) over (partition by itt.InterfaceID), 
     MaxInBPS = max(In_Maxbps) over (partition by itt.InterfaceID), 
     AvgInBPS = avg(In_Maxbps) over (partition by itt.InterfaceID), 
     itt.InterfaceID, 
     itt.datetime, 
     RN = ROW_NUMBER() OVER (PARTITION BY itt.InterfaceID ORDER BY itt.InterfaceID asc) 
    from InterfaceTraffic_detail as itt with (nolock) 
    where (itt.DateTime >= '2015-06-23 01:00:00' 
     and itt.DateTime <= '2015-06-23 05:00:00' 
     and (itt.InterfaceID = 489108 or itt.InterfaceID = 489109 or itt.InterfaceID = 1220996)) 
) 
SELECT * FROM CTE 
WHERE RN = 1 
order by InterfaceID asc; 
+0

Вы рок :), что было так быстро и так полезно – abarik

0

Упрощая запрос не работает без проблем , Было довольно много небольших ошибок, которые, вероятно, возникали при вводе текста, а не в запросе.

Вам не удастся сгруппировать что-либо, пока вы включаете поле datetime.

select 
    max(Out_Maxbps), 
    avg(Out_Maxbps), 
    max(In_Maxbps), 
    avg(In_Maxbps), 
    InterfaceID 
from InterfaceTraffic_detail 
group by InterfaceID 
+0

Вы пропустили столбец 'itt.datetime' – ughai

+0

Конечно, я по этой причине я упомянул. Я запустил версию CTE, и это сработало, но я не понимаю, почему это необходимо. Вы либо хотите последнее время или первое время, так что Min или Max будут работать точно так же в этом поле, как и на других? –

Смежные вопросы