Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 поиск локальных минимумов и максимумов  [new]
XLiMeR
Member

Откуда:
Сообщений: 11
прошу помочь с запросом,
есть данные за определенный период времени,
график идет с чередующимися локальными минимумами и максимумами, необходимо
найти по парам все последовательные локальные минимумы и следующие за ними локальные максимумы функции,
т.е. результат:
NDateMinDateMaxValueMinValueMax
12011-07-05 09:57:02.0002011-07-05 10:23:18.00031379471
22011-07-08 09:09:10.0002011-07-08 09:50:22.00038479548
32011-07-13 09:14:00.0002011-07-13 10:00:36.0007529504


вот исходные данные
datevalue
2011-07-01 09:18:50.0009078
2011-07-01 16:11:32.0008080
2011-07-02 14:32:02.0007098
2011-07-02 23:35:30.0006001
2011-07-03 17:10:06.0005001
2011-07-04 15:25:52.0004000
2011-07-05 09:57:02.0003137
2011-07-05 09:58:22.0003565
2011-07-05 09:59:24.0004187
2011-07-05 10:00:44.0005184
2011-07-05 10:02:26.0006282
2011-07-05 10:04:48.0007342
2011-07-05 10:08:32.0008377
2011-07-05 10:12:16.0008947
2011-07-05 10:23:18.0009471
2011-07-05 15:07:12.0009004
2011-07-05 18:15:40.0008506
2011-07-05 23:53:38.0008012
2011-07-06 13:40:26.0007015
2011-07-06 19:00:16.0006012
2011-07-07 13:43:28.0005016
2011-07-07 16:29:26.0004509
2011-07-08 08:14:32.0004032
2011-07-08 09:09:10.0003847
2011-07-08 09:13:04.0004432
2011-07-08 09:14:06.0005067
2011-07-08 09:15:46.0006201
2011-07-08 09:19:10.0007660
2011-07-08 09:20:52.0008171
2011-07-08 09:23:34.0008719
2011-07-08 09:50:22.0009548
2011-07-08 16:13:20.0009012
2011-07-08 22:52:52.0008402
2011-07-09 13:20:40.0007194
2011-07-09 21:29:18.0006111
2011-07-10 13:13:12.0005087
2011-07-11 16:10:44.0004014
2011-07-11 22:39:08.0003023
2011-07-12 14:46:50.0002069
2011-07-12 18:49:54.0001498
2011-07-12 23:20:38.0001002
2011-07-13 09:14:00.000752
2011-07-13 09:17:58.0001443
2011-07-13 09:18:58.0002127
2011-07-13 09:19:40.0002806
2011-07-13 09:20:40.0003727
2011-07-13 09:22:02.0004881
2011-07-13 09:23:22.0005773
2011-07-13 09:25:24.0006826
2011-07-13 09:28:08.0007836
2011-07-13 09:34:32.0008986
2011-07-13 10:00:36.0009504
2011-07-13 15:21:00.0008973
2011-07-13 21:08:04.0008116
2011-07-14 16:51:06.0007145

прошу помочь или подсказать как это возможно сделать на T-SQL в ms sql2k8?

К сообщению приложен файл. Размер - 13Kb
14 июл 11, 14:40    [10973997]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
XLiMeR, а если подряд идут два одинаковых значения, то какое из них будет считаться экстремумом, т.е. какое время будет в результате?
14 июл 11, 14:55    [10974172]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
aleks2
Guest
XLiMeR
прошу помочь или подсказать как это возможно сделать на T-SQL в ms sql2k8?


Ты не могешь пронумеровать свои точки последовательно? Тады изучай ROW_NUNMBER()...
14 июл 11, 15:06    [10974294]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
_ч_
Member

Откуда:
Сообщений: 1447
XLiMeR,

https://www.sql.ru/forum/actualthread.aspx?tid=107807&hl=%fd%ea%f1%f2%f0%e5%ec%f3%ec%fb
14 июл 11, 15:29    [10974501]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
_ч_
Member

Откуда:
Сообщений: 1447
XLiMeR,

получите, распишитесь


declare @t table([date] datetime, value int)

insert into @t
select '20110701 09:18:50.000',	9078
union select'20110701 16:11:32.000',	8080
union select '20110702 14:32:02.000',	7098
union select '20110702 23:35:30.000', 6001
union select '20110703 17:10:06.000',	5001
union select '20110704 15:25:52.000',	4000
union select '20110705 09:57:02.000',	3137
union select '20110705 09:58:22.000',	3565
union select '20110705 09:59:24.000',	4187
union select '20110705 10:00:44.000',	5184
union select '20110705 10:02:26.000',	6282
union select '20110705 10:04:48.000',	7342
union select '20110705 10:08:32.000',	8377
union select '20110705 10:12:16.000',	8947
union select '20110705 10:23:18.000',	9471
union select '20110705 15:07:12.000',	9004
union select '20110705 18:15:40.000',	8506
union select '20110705 23:53:38.000',	8012
union select '20110706 13:40:26.000',	7015
union select '20110706 19:00:16.000',	6012
union select '20110707 13:43:28.000',	5016
union select '20110707 16:29:26.000',	4509
union select '20110708 08:14:32.000',	4032
union select '20110708 09:09:10.000',	3847
union select '20110708 09:13:04.000',	4432
union select '20110708 09:14:06.000',	5067
union select '20110708 09:15:46.000',	6201
union select '20110708 09:19:10.000',	7660
union select '20110708 09:20:52.000',	8171
union select '20110708 09:23:34.000',	8719
union select '20110708 09:50:22.000',	9548
union select '20110708 16:13:20.000',	9012
union select '20110708 22:52:52.000',	8402
union select '20110709 13:20:40.000',	7194
union select '20110709 21:29:18.000',	6111
union select '20110710 13:13:12.000',	5087
union select '20110711 16:10:44.000',	4014
union select '20110711 22:39:08.000',	3023
union select '20110712 14:46:50.000',	2069
union select '20110712 18:49:54.000',	1498
union select '20110712 23:20:38.000',	1002
union select '20110713 09:14:00.000',	752
union select '20110713 09:17:58.000',	1443
union select '20110713 09:18:58.000',	2127
union select '20110713 09:19:40.000',	2806
union select '20110713 09:20:40.000',	3727
union select '20110713 09:22:02.000',	4881
union select '20110713 09:23:22.000',	5773
union select '20110713 09:25:24.000',	6826
union select '20110713 09:28:08.000',	7836
union select '20110713 09:34:32.000',	8986
union select '20110713 10:00:36.000',	9504
union select '20110713 15:21:00.000',	8973
union select '20110713 21:08:04.000',	8116
union select '20110714 16:51:06.000',	7145




select ROW_NUMBER() over (order by diap.[begin]) as N, begin_value.[date] as DateMin, end_value.[date] as DateMax, begin_value.value as ValueMin, end_value.value as ValueMax from(	
select MIN(num) as [begin], MAX(num)+1 [end]
  from (
         select t.* , ROW_NUMBER() over(order by num) - num as grp_id
           from (
           select t.Num from(select ROW_NUMBER() over (order by [date]) as Num, [DATE], value from @t) t
			inner join
			(select ROW_NUMBER() over (order by [date]) as Num, [DATE], value from @t)t2
			on t2.Num-1 = t.num
			where t.value < t2.value
           ) t
       ) v
 group by grp_id
 )diap
 inner join 
 (select ROW_NUMBER() over(order by [date]) as Num, * from @t)begin_value on begin_value.num = diap.[begin] 
  inner join 
 (select ROW_NUMBER() over(order by [date]) as Num, * from @t)end_value on end_value.num = diap.[end] 
 order by [begin]
 
14 июл 11, 15:44    [10974619]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
XLiMeR,

-- Исходные данные
CREATE TABLE #Data ([date] datetime NOT NULL , value int NOT NULL);

INSERT INTO #Data
VALUES('20110701 09:18:50.000',	9078),
('20110701 16:11:32.000', 8080),
('20110702 14:32:02.000', 7098),
('20110702 23:35:30.000', 6001),
('20110703 17:10:06.000', 5001),
('20110704 15:25:52.000', 4000),
('20110705 09:57:02.000', 3137),
('20110705 09:58:22.000', 3565),
('20110705 09:59:24.000', 4187),
('20110705 10:00:44.000', 5184),
('20110705 10:02:26.000', 6282),
('20110705 10:04:48.000', 7342),
('20110705 10:08:32.000', 8377),
('20110705 10:12:16.000', 8947),
('20110705 10:23:18.000', 9471),
('20110705 15:07:12.000', 9004),
('20110705 18:15:40.000', 8506),
('20110705 23:53:38.000', 8012),
('20110706 13:40:26.000', 7015),
('20110706 19:00:16.000', 6012),
('20110707 13:43:28.000', 5016),
('20110707 16:29:26.000', 4509),
('20110708 08:14:32.000', 4032),
('20110708 09:09:10.000', 3847),
('20110708 09:13:04.000', 4432),
('20110708 09:14:06.000', 5067),
('20110708 09:15:46.000', 6201),
('20110708 09:19:10.000', 7660),
('20110708 09:20:52.000', 8171),
('20110708 09:23:34.000', 8719),
('20110708 09:50:22.000', 9548),
('20110708 16:13:20.000', 9012),
('20110708 22:52:52.000', 8402),
('20110709 13:20:40.000', 7194),
('20110709 21:29:18.000', 6111),
('20110710 13:13:12.000', 5087),
('20110711 16:10:44.000', 4014),
('20110711 22:39:08.000', 3023),
('20110712 14:46:50.000', 2069),
('20110712 18:49:54.000', 1498),
('20110712 23:20:38.000', 1002),
('20110713 09:14:00.000', 752),
('20110713 09:17:58.000', 1443),
('20110713 09:18:58.000', 2127),
('20110713 09:19:40.000', 2806),
('20110713 09:20:40.000', 3727),
('20110713 09:22:02.000', 4881),
('20110713 09:23:22.000', 5773),
('20110713 09:25:24.000', 6826),
('20110713 09:28:08.000', 7836),
('20110713 09:34:32.000', 8986),
('20110713 10:00:36.000', 9504),
('20110713 15:21:00.000', 8973),
('20110713 21:08:04.000', 8116),
('20110714 16:51:06.000', 7145);

-- Теперь попробуем решить.
CREATE TABLE #Temp
(RowN Int Identity(1, 1), [Date] Datetime, Value Int, Prev Smallint, [Next] Smallint);

INSERT INTO #Temp ([date], value, Prev, [Next])
SELECT [date], value, 0, 0 FROM #Data
ORDER BY [date];

UPDATE #Temp
SET
	Prev = CASE WHEN #Temp.Value > T1.Value THEN 1 WHEN #Temp.Value < T1.Value THEN -1 ELSE 0 END,
	[Next] = CASE WHEN #Temp.Value > T2.Value THEN -1 WHEN #Temp.Value < T1.Value THEN 1 ELSE 0 END
FROM #Temp
	INNER JOIN #Temp AS T1 ON #Temp.RowN = T1.RowN - 1
	INNER JOIN #Temp AS T2 ON #Temp.RowN = T2.RowN + 1;

SELECT
	ISNULL(MinVal.N, MaxVal.N) AS N,
	MinVal.Date AS DateMin,
	MaxVal.Date AS DateMax,
	MinVal.Value AS ValMin,
	MaxVal.Value AS ValMax
FROM
	(SELECT
		ROW_NUMBER() OVER (ORDER BY [Date]) AS N,
		[Date], Value
	FROM #Temp
	WHERE Prev = -1 AND [Next] = 1) AS MinVal FULL OUTER JOIN
	(SELECT
		ROW_NUMBER() OVER (ORDER BY [Date]) AS N,
		[Date], Value
	FROM #Temp
	WHERE Prev = 1 AND [Next] = -1) AS MaxVal ON MinVal.N = MaxVal.N

DROP TABLE #Temp;
DROP TABLE #Data;
14 июл 11, 15:44    [10974628]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
_ч_,

Ну надо же! Опоздал буквально на несколько секунд. :))
Ваш вариант даёт верные результаты, по крайнем мере точно такие же данные, что и просил ТС.
14 июл 11, 15:55    [10974716]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
XLiMeR,

Попробуйте и мой вариант на реальных данных. Напишите потом please результат. Мне хотелось бы знать, что работает быстрее: временная таблица с identity или ROW_NUMBER().
14 июл 11, 15:58    [10974743]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
AmKad
Member

Откуда:
Сообщений: 5310
+
with t as 
(select '20110701 09:18:50.000' dt,	9078 val
union all select'20110701 16:11:32.000',	8080
union all select '20110702 14:32:02.000',	7098
union all select '20110702 23:35:30.000', 6001
union all select '20110703 17:10:06.000',	5001
union all select '20110704 15:25:52.000',	4000
union all select '20110705 09:57:02.000',	3137
union all select '20110705 09:58:22.000',	3565
union all select '20110705 09:59:24.000',	4187
union all select '20110705 10:00:44.000',	5184
union all select '20110705 10:02:26.000',	6282
union all select '20110705 10:04:48.000',	7342
union all select '20110705 10:08:32.000',	8377
union all select '20110705 10:12:16.000',	8947
union all select '20110705 10:23:18.000',	9471
union all select '20110705 15:07:12.000',	9004
union all select '20110705 18:15:40.000',	8506
union all select '20110705 23:53:38.000',	8012
union all select '20110706 13:40:26.000',	7015
union all select '20110706 19:00:16.000',	6012
union all select '20110707 13:43:28.000',	5016
union all select '20110707 16:29:26.000',	4509
union all select '20110708 08:14:32.000',	4032
union all select '20110708 09:09:10.000',	3847
union all select '20110708 09:13:04.000',	4432
union all select '20110708 09:14:06.000',	5067
union all select '20110708 09:15:46.000',	6201
union all select '20110708 09:19:10.000',	7660
union all select '20110708 09:20:52.000',	8171
union all select '20110708 09:23:34.000',	8719
union all select '20110708 09:50:22.000',	9548
union all select '20110708 16:13:20.000',	9012
union all select '20110708 22:52:52.000',	8402
union all select '20110709 13:20:40.000',	7194
union all select '20110709 21:29:18.000',	6111
union all select '20110710 13:13:12.000',	5087
union all select '20110711 16:10:44.000',	4014
union all select '20110711 22:39:08.000',	3023
union all select '20110712 14:46:50.000',	2069
union all select '20110712 18:49:54.000',	1498
union all select '20110712 23:20:38.000',	1002
union all select '20110713 09:14:00.000',	752
union all select '20110713 09:17:58.000',	1443
union all select '20110713 09:18:58.000',	2127
union all select '20110713 09:19:40.000',	2806
union all select '20110713 09:20:40.000',	3727
union all select '20110713 09:22:02.000',	4881
union all select '20110713 09:23:22.000',	5773
union all select '20110713 09:25:24.000',	6826
union all select '20110713 09:28:08.000',	7836
union all select '20110713 09:34:32.000',	8986
union all select '20110713 10:00:36.000',	9504
union all select '20110713 15:21:00.000',	8973
union all select '20110713 21:08:04.000',	8116
union all select '20110714 16:51:06.000',	7145
),
s as
 (select t.*, row_number() over (order by dt) rn
  from t
 )
select s2.dt, s2.val, 
case when s1.val > s2.val and s2.val < s3.val then 'min'  
     when s1.val < s2.val and s2.val > s3.val then 'max'
end tp     
from s s1, s s2, s s3
where s1.rn + 1 = s2.rn and s2.rn = s3.rn - 1
and (s1.val > s2.val and s2.val < s3.val
     or 
     s1.val < s2.val and s2.val > s3.val
    )
order by s2.dt 
14 июл 11, 15:59    [10974756]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
XLiMeR
Member

Откуда:
Сообщений: 11
Shakill
XLiMeR, а если подряд идут два одинаковых значения, то какое из них будет считаться экстремумом, т.е. какое время будет в результате?

первое будет считаться экстремумом, т.к. функция возрастает до первого одинакового значения
14 июл 11, 16:02    [10974782]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
XLiMeR
Member

Откуда:
Сообщений: 11
aleks2
XLiMeR
прошу помочь или подсказать как это возможно сделать на T-SQL в ms sql2k8?


Ты не могешь пронумеровать свои точки последовательно? Тады изучай ROW_NUNMBER()...


пронумеровать могу конечно, с ROW_NUMBER() уже работал, но результата не получилось, поэтому и задал вопрос
14 июл 11, 16:05    [10974806]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
XLiMeR
Shakill
XLiMeR, а если подряд идут два одинаковых значения, то какое из них будет считаться экстремумом, т.е. какое время будет в результате?

первое будет считаться экстремумом, т.к. функция возрастает до первого одинакового значения

решений вам уже накидали, но с учётом этой фразы сравнение текущей точки со следующей надо будет делать через нестрогое неравенство, т.е. <= и >=
14 июл 11, 16:07    [10974820]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
XLiMeR
Member

Откуда:
Сообщений: 11
_ч_
XLiMeR,

получите, распишитесь



все СУПЕР, спасибо!
14 июл 11, 16:08    [10974832]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
NETClient
Member

Откуда:
Сообщений: 461
_ч_,

6 раз роунамбер дернул! Рекордсмен!
14 июл 11, 16:11    [10974855]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
_ч_
Member

Откуда:
Сообщений: 1447
NETClient,
Row_Number() сильно замедляет запросы?
14 июл 11, 16:13    [10974874]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
XLiMeR
Member

Откуда:
Сообщений: 11
studieren
XLiMeR,

Попробуйте и мой вариант на реальных данных. Напишите потом please результат. Мне хотелось бы знать, что работает быстрее: временная таблица с identity или ROW_NUMBER().


проверю на большом диапазоне эти два варианта, чтоб увидеть разницу, отпишусь
14 июл 11, 16:13    [10974876]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
NETClient
Member

Откуда:
Сообщений: 461
studieren
UPDATE #Temp
SET
	Prev = CASE WHEN #Temp.Value > T1.Value THEN 1 WHEN #Temp.Value < T1.Value THEN -1 ELSE 0 END,
	[Next] = CASE WHEN #Temp.Value > T2.Value THEN -1 WHEN #Temp.Value < T1.Value THEN 1 ELSE 0 END
FROM #Temp
	INNER JOIN #Temp AS T1 ON #Temp.RowN = T1.RowN - 1
	INNER JOIN #Temp AS T2 ON #Temp.RowN = T2.RowN + 1;

SELECT
	ISNULL(MinVal.N, MaxVal.N) AS N,
	MinVal.Date AS DateMin,
	MaxVal.Date AS DateMax,
	MinVal.Value AS ValMin,
	MaxVal.Value AS ValMax
FROM
	(SELECT
		ROW_NUMBER() OVER (ORDER BY [Date]) AS N,
		[Date], Value
	FROM #Temp
	WHERE Prev = -1 AND [Next] = 1) AS MinVal FULL OUTER JOIN
	(SELECT
		ROW_NUMBER() OVER (ORDER BY [Date]) AS N,
		[Date], Value
	FROM #Temp
	WHERE Prev = 1 AND [Next] = -1) AS MaxVal ON MinVal.N = MaxVal.N

DROP TABLE #Temp;
DROP TABLE #Data;

На хрена тебе все эти свистопляски с роунамбером если у тебя в темпе #Temp-е RowN(identity) отсортировано по дате?
14 июл 11, 16:29    [10975057]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
_ч_
Member

Откуда:
Сообщений: 1447
да. мой запрос будет выполняться дольше всего
14 июл 11, 16:36    [10975113]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
NETClient
Member

Откуда:
Сообщений: 461
_ч_
да. мой запрос будет выполняться дольше всего

Модераторы не спят, мое замечание уже почистили.
14 июл 11, 16:38    [10975123]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
XLiMeR
Member

Откуда:
Сообщений: 11
studieren
XLiMeR,

Попробуйте и мой вариант на реальных данных. Напишите потом please результат. Мне хотелось бы знать, что работает быстрее: временная таблица с identity или ROW_NUMBER().


попробовал два варианта, столкнулся с тем , что в данных большого объема есть флуктуации вплоть до значения разностей, доходящих до 300.
как можно сделать корректировку на возможные отклонения, не являющиеся минимумами и максимумами,
в тех случаях когда ValueMax-ValueMin<=500 ?
14 июл 11, 16:51    [10975219]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
AmKad
Member

Откуда:
Сообщений: 5310
XLiMeR,

Когда соседние минимум и максимум отличаются не более чем на 500?
14 июл 11, 16:56    [10975260]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
XLiMeR
Member

Откуда:
Сообщений: 11
AmKad
XLiMeR,

Когда соседние минимум и максимум отличаются не более чем на 500?

ну да, нужно исключить эти варианты,
в среднем значения реальных разностей должны быть >5000
вот например, что получается сейчас:
NDateMinDateMaxValueMinValueMax
1202011-07-12 19:00:02.0002011-07-12 19:56:00.00014541474
1212011-07-12 19:58:02.0002011-07-12 20:12:56.00014511512
1222011-07-12 23:29:36.0002011-07-13 05:35:10.0009391000
1232011-07-13 09:14:00.0002011-07-13 09:16:16.000752835
1242011-07-13 09:16:16.0002011-07-13 09:16:56.000835986
1252011-07-13 09:16:56.0002011-07-13 09:17:16.0009861112
1262011-07-13 09:17:16.0002011-07-13 09:17:38.00011121267
1272011-07-13 09:17:38.0002011-07-13 09:17:58.00012671443
1282011-07-13 09:17:58.0002011-07-13 09:18:18.00014431719
1292011-07-13 09:18:18.0002011-07-13 09:18:38.00017191956
1302011-07-13 09:18:38.0002011-07-13 09:18:58.00019562127
14 июл 11, 17:06    [10975331]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
XLiMeR, так замените в запросах поиска экстремумов все сравнения соседних значений, например, T1.value < T2.value на T.value < T2.value + 500
14 июл 11, 17:15    [10975408]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
NETClient
На хрена тебе все эти свистопляски с роунамбером если у тебя в темпе #Temp-е RowN(identity) отсортировано по дате?


Не согласен с Вами, несправедливое замечание. Если вместо ROW_NUMBER() написать RowN (identity), то запрос перестанет работать нормально и отчёт не будет выглядит так, как хочет ТС. ROW_NUMBER() мне понадобился, чтобы связать MAX и MIN значения в 1 ряд.
14 июл 11, 20:43    [10976448]     Ответить | Цитировать Сообщить модератору
 Re: поиск локальных минимумов и максимумов  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
XLiMeR,

XLiMeR
попробовал два варианта, столкнулся с тем , что в данных большого объема есть флуктуации вплоть до значения разностей, доходящих до 300.
как можно сделать корректировку на возможные отклонения, не являющиеся минимумами и максимумами,
в тех случаях когда ValueMax-ValueMin<=500 ?


Надо в конце добавить фильтр
...
SELECT
	ISNULL(MinVal.N, MaxVal.N) AS N,
	MinVal.Date AS DateMin,
	MaxVal.Date AS DateMax,
	MinVal.Value AS ValMin,
	MaxVal.Value AS ValMax
FROM
	(SELECT
		ROW_NUMBER() OVER (ORDER BY [Date]) AS N,
		[Date], Value
	FROM #Temp
	WHERE Prev = -1 AND [Next] = 1) AS MinVal FULL OUTER JOIN
	(SELECT
		ROW_NUMBER() OVER (ORDER BY [Date]) AS N,
		[Date], Value
	FROM #Temp
	WHERE Prev = 1 AND [Next] = -1) AS MaxVal ON MinVal.N = MaxVal.N
WHERE ABS(MaxVal.Value-MinVal.Value) > 500;
14 июл 11, 20:55    [10976487]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить