2016-07-17 2 views
0

У меня есть сценарий, в котором мне требуется среднее значение столбца использования за 15 секунд и суммирование до одного часа. для конкретного MID, SID и PID. Теперь я делаю это, увеличивая цикл времени на 15 секунд dateadd (второй, 15, @StartTime), но это очень медленно. Пожалуйста, предложите лучшее решение. См. Таблицу ниже.Среднее значение столбца за 15 секунд

CREATE TABLE [dbo].[SampleData](
[MID] [varchar](50) NOT NULL, 
[StartTime] [datetime] NOT NULL, 
[SID] [int] NOT NULL, 
[PID] [int] NOT NULL, 
[Usage] [decimal](10, 4) NOT NULL 
) ON [PRIMARY] 
enter code here 

Выборочные данные

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A64500001068 AS DateTime), 1, 1, CAST(27.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A645000020D0 AS DateTime), 1, 1, CAST(40.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A64500003138 AS DateTime), 1, 1, CAST(98.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A645000041A0 AS DateTime), 1, 1, CAST(58.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A6450010CCC8 AS DateTime), 1, 1, CAST(74.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A6450010DD30 AS DateTime), 1, 1, CAST(42.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A6450010ED98 AS DateTime), 1, 1, CAST(34.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A6450010FE00 AS DateTime), 1, 1, CAST(36.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A64500218928 AS DateTime), 1, 1, CAST(84.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A64500219990 AS DateTime), 1, 1, CAST(19.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A6450021A9F8 AS DateTime), 1, 1, CAST(40.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A6450021BA60 AS DateTime), 1, 1, CAST(48.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A64500324588 AS DateTime), 1, 1, CAST(97.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A645003255F0 AS DateTime), 1, 1, CAST(48.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A64500326784 AS DateTime), 1, 1, CAST(60.0000 AS Decimal(10, 4))) 

INSERT [dbo].[SampleData] ([MID], [StartTime], [SID], [PID], [Usage]) VALUES (N'77', CAST(0x0000A64500327DC8 AS DateTime), 1, 1, CAST(48.0000 AS Decimal(10, 4))) 
+1

Некоторые образцы данных и желаемые результаты были бы полезны –

+0

Не могли бы вы также добавить свой текущий код, который включает в себя цикл. – trincot

+0

Вы имеете в виду: среднее значение столбца использования ** каждые ** 15 секунд? – Parfait

ответ

0
  • Внутренний SQL: Среднее значение Usage для каждого четверть минуты (= 15 секунд) в минуту, в час, в день, МОНТЕ и год.
  • Внешний SQL: сумма вышеуказанных средних значений за каждый час.

Внутренний SQL: среднее значение Usage за каждую четверть минуты (= 15 секунд).

SELECT [MID], [SID], [PID], 
Yr, 
Mn, 
Dy, 
Hr 
SUM(AvgUse) AS HourSumOfUse 
FROM 
( 
    SELECT [MID], [SID], [PID], 
    YEAR([StartTime]) AS Yr, 
    MONTH([StartTime]) AS Mn, 
    DAY([StartTime]) AS Dy, 
    DATEPART ("HH",[StartTime]) AS Hr, 
    DATEPART ("Mi", [StartTime]) AS Mn, 
    CAST(DATEPART ("ss", [StartTime])/15 + 1, Int) AS Q_Min, 
    Avg([Usage]) AS AvgUse 
    FROM [dbo].[SampleData] 
    GROUP BY [MID], [SID], [PID], 
     YEAR([StartTime]), 
     MONTH([StartTime]), 
     DAY([StartTime]), 
     DATEPART ("HH",[StartTime]), 
     DATEPART ("Mi", [StartTime]), 
     CAST(DATEPART ("ss", [StartTime])/15 + 1, Int) 
) 
GROUP BY [MID], [SID], [PID], 
    Yr, 
    Mn, 
    Dy, 
    Hr 
+0

В том же образце кода я хочу выбрать данные в соответствии с dateTime i.e StartDate между (Select Max (Sdate) из MasteTbl), Пожалуйста, предложите решение – Shijith

+0

Добавить предложение WHERE во внутреннем SQL – marlan

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