MS SQL Server: получение локальных значений min / max из групп значений, разделенных на периоды времени - PullRequest
1 голос
/ 24 февраля 2011

предположим, у меня есть таблица значений с плавающей точкой со столбцами Value_ID, ValueTime, Value.

Если я сделаю это:

SELECT t.IntervalGroup
       , Min(t.Value) as MinValue  
       , Max(t.Value) as MaxValue  
       , COUNT(t.Value) as #Values  
FROM (  
       SELECT Value  
              , Valuetime  
              , (DATEDIFF(MINUTE, '2010-09-24 00:00:00', ValueTime) / 10) AS IntervalGroup  
       FROM [testdata].[dbo].T003ValueFloat  
       WHERE Tag_Id = 272 and ValueTime  between '2010-09-24' and '2010-09-26'  
     ) t  
GROUP BY t.IntervalGroup  
having t.IntervalGroup < 6  
order by t.IntervalGroup asc

Я получаю такой результат:

IntervalGroup MinValue               MaxValue               #Values
------------- ---------------------- ---------------------- -----------
0             7,48281145095825       8,18281173706055       365
1             7,34531164169312       8,10468673706055       364
2             7,29062461853027       8,09062480926514       362
3             6,76249933242798       8,02812385559082       356
4             6,77031183242798       8,47656154632568       362
5             7,41874933242798       8,09374904632568       364

(6 row(s) affected)

Итак, я знаю количество значений за период (IntervalGroup) и абсолютное минимальное / максимальное значение этого периода.

Но мне также нужно знать Value_IDs соответствующих значений min / max.

Так что я хотел бы получить что-то вроде этого:

IntervalGroup MinValue  Value_IDofMinValue  MaxValue    Value_ID_ofMaxValue #Values
------------- --------- ------------------- ----------- ------------------- -------
0             7,482811  12345               8,1828117   23456               365

Кто-нибудь может мне помочь?

ТИА, Sascha

1 Ответ

1 голос
/ 24 февраля 2011
WITH datatable AS (
  SELECT
    Value,
    Valuetime,
    IntervalGroup = (DATEDIFF(MINUTE, '2010-09-24 00:00:00', ValueTime) / 10),
    Value_ID
  FROM [testdata].[dbo].T003ValueFloat
  WHERE Tag_Id = 272 and ValueTime  between '2010-09-24' and '2010-09-26'
)
SELECT
  t.IntervalGroup,
  t.MinValue,
  Value_IDofMinValue = t_min.Value_ID,
  t.MaxValue,
  Value_IDofMinValue = t_max.Value_ID,
  t.#Values
FROM (
  SELECT IntervalGroup
         , Min(Value) as MinValue
         , Max(Value) as MaxValue
         , COUNT(Value) as #Values
  FROM datatable
  WHERE IntervalGroup < 6
  GROUP BY IntervalGroup
) AS t
  INNER JOIN datatable AS t_min ON t.IntervalGroup = t_min.IntervalGroup
    AND t.MinValue = t_min.Value
  INNER JOIN datatable AS t_max ON t.IntervalGroup = t_max.IntervalGroup
    AND t.MaxValue = t_max.Value
order by t.IntervalGroup asc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...