powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировака временного ряда
18 сообщений из 18, страница 1 из 1
Группировака временного ряда
    #32071629
valmond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа подскажите красивое решение.
Есть таблица
moment (datetime)
first (nimeric)
last (nimeric)
high (nimeric)
low (nimeric)

moment это минутные значения (т.е. первое значение за минуту, последнее, максимальное и минимальное)

необходимо построить аналогичный ряд, но по другому периоду. Например по 5 минут (аналогично первое, последнее, максимальное за 5 мин и минимальное)
Как сделать с курсорами понятно, а как сделать без курсоров? Тут по идее как-то группировкой можно обойтись...или нет?
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071639
Sergey A.Ledenev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот уж непонятнее вопроса я и не встречал. Нельзя ли поупорядоченнее?
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071640
valmond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок. постараюсь подробнее.

есть минутные данные (tb_min1)
moment | open | close | max | min
10.01.00 | 1.0 | 1.2 | 1.4 | 1.0
10.02.00 | 2.0 | 2.2 | 2.4 | 2.0
10.03.00 | 3.0 | 3.2 | 3.4 | 0.1
10.04.00 | 4.0 | 4.2 | 6.4 | 4.0
10.05.00 | 5.1 | 5.3 | 5.5 | 5.0

open значение измеряемой величины на начало минуты
close значение измеряемой величины на конец минуты
max максимально значение измеряемой величины за минуту
min минимальное значение измеряемой величины за минуту

из этих данных необходимо построить аналогичный ряд, но за период 5 минут.
т.е.
moment | open | close | max | min
10.05.00 | 1.0 | 5.3 | 6.4 | 0.1

open первое значение из столбца open_1_min
close последнее значение из столбца tb_1min.close
max = max(tb_1min.max)
min = min(tb_1min.min)

Опять плохо описал? :-(
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071642
Sergey A.Ledenev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь лучше... Задача и впрямь интересная. Надо помозговать.
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071643
valmond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я делаю GROUP , то я могу как-то обработать данные внутри группы (например взять первое значение одного поля и последнее значение другого поля)?
Не хранятся ли эти данные в каких-то временных таблицах?
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071645
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @t table(
moment datetime,
[first] numeric,
[last] numeric,
[max] numeric,
[min] numeric)
insert @t
select '10:01:00', 1 . 0 , 1 . 2 , 1 . 4 , 1 . 0  union all
select '10:02:00', 2 . 0 , 2 . 2 , 2 . 4 , 2 . 0  union all
select '10:03:00', 3 . 0 , 3 . 2 , 3 . 4 , 0 . 1  union all
select '10:04:00', 4 . 0 , 4 . 2 , 6 . 4 , 4 . 0  union all
select '10:05:00', 5 . 1 , 5 . 3 , 5 . 5 , 5 . 0  union all
select '10:06:00', 6 . 0 , 6 . 2 , 6 . 4 , 6 . 0  union all
select '10:07:00', 7 . 0 , 7 . 2 , 7 . 4 , 8 . 0  union all
select '10:08:00', 8 . 0 , 8 . 2 , 8 . 4 , 0 . 3  union all
select '10:09:00', 9 . 0 , 9 . 2 , 9 . 4 , 9 . 0  union all
select '10:10:00', 10 . 1 , 10 . 3 , 10 . 5 , 10 . 0  
select * from @t
select max(moment),min([first]),max([last]),max([max]),min([min])
from @t
group by (datepart(n,moment)+ 1 )/ 6 
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071646
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин... последнюю строку читать так:
Код: plaintext
group by (datepart(n,moment)- 1 ) 5 
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071653
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MiCe. Это в общем виде не катит. \r
\r
Не очень красиво, но работает\r
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
\r
 --/topic/16572\r
 
set nocount on\r
\r
create table abc (\r
moment  datetime primary key,\r
first int, \r
last int, \r
hight int, \r
low int \r
)\r
\r
\r
declare @s int\r
declare @d datetime\r
set @d=convert(datetime,convert(char( 16 ),getdate(), 120 ), 120 )\r
set @s= 0 \r
while @s< 9 \r
begin\r
insert into abc (moment,first,last) values (dateadd(minute,@s,@d), 100 *rand(), 100 *rand())\r
set @s=@s+ 1 \r
end\r
\r
update abc \r
set hight=first+last,\r
low= case when first<last then first else last end\r
\r
go\r
declare @moment datetime\r
declare @period int\r
select @moment=min(moment) from abc\r
set @period= 3 \r
\r
select * from abc\r
\r
select moment, max(first),max(last),max(hight),max(low) from \r
(\r
select min(moment) as moment, \r
 0  as first,\r
 0  as last,\r
max(hight) as hight,\r
min(low) as low \r
\r
from abc\r
group by datediff(minute,@moment,moment)/@period\r
\r
union\r
\r
select moment,first, 0 , 0 , 0  from abc\r
where datediff(minute,@moment,moment)%@period= 0 \r
\r
union\r
\r
select dateadd(minute,-@period+ 1 ,moment), 0 ,last, 0 , 0  from abc\r
where datediff(minute,@moment,moment)%@period=@period- 1 \r
) as t\r
group by moment\r
\r
go\r
\r
drop table abc\r
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071660
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может вообще так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @period int
set @period= 5 

select min(moment), 
(select top  1  [open] from @t b where (datepart(n,b.moment)- 1 )/@period = (datepart(n,a.moment)- 1 )/@period order by moment),
(select top  1  [close] from @t b where (datepart(n,b.moment)- 1 )/@period = (datepart(n,a.moment)- 1 )/@period order by moment desc), 
max([max]),min([min])
from @t a
group by (datepart(n,moment)- 1 )/@period
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071689
valmond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но в таком случае обрабатывають данные можно только за час т.к. потом будет группировка пересекатся за разные часы.
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071690
valmond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял.
надо просто изменить

Код: plaintext
group by (datepart(n,moment)- 1 )/@period,datepart(hh,moment),datepart(dy,moment),datepart(yy,moment)


так?
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071696
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе - да. Но можно и так

Код: plaintext
group by convert(char( 13 ), moment,  121 ), (datepart(n,moment)- 1 )/@period
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071699
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>
valmond
Группировка из примера Glory пересекаться не будет.

> Glory
Это не катит, хотя вроде должно работать. В тестовых данных автора топика первые значения за минуту упорядочены по возрастанию. Сомневаюсь, что так есть всегда.

Результат твоего запроса по моим данным, период=3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
moment                      first       last        hight       low         
 --------------------------- ----------- ----------- ----------- ----------- 
 
 2002 - 11 - 24   15 : 14 : 00 . 000       54            85            139           54 
 2002 - 11 - 24   15 : 15 : 00 . 000       97            27            124           27 
 2002 - 11 - 24   15 : 16 : 00 . 000       27            12            39            12 

 2002 - 11 - 24   15 : 17 : 00 . 000       5             72            77            5 
 2002 - 11 - 24   15 : 18 : 00 . 000       1             42            43            1 
 2002 - 11 - 24   15 : 19 : 00 . 000       30            97            127           30 

 2002 - 11 - 24   15 : 20 : 00 . 000       2             83            85            2 
 2002 - 11 - 24   15 : 21 : 00 . 000       61            20            81            20 
 2002 - 11 - 24   15 : 22 : 00 . 000       98            72            170           72 

                            first       last        hight       low         
 --------------------------- ----------- ----------- ----------- ----------- 
 
 2002 - 11 - 24   15 : 14 : 00 . 000       54            27            139           27 
 2002 - 11 - 24   15 : 16 : 00 . 000       27            42            77            1 
 2002 - 11 - 24   15 : 19 : 00 . 000       30            20            127           2 
 2002 - 11 - 24   15 : 22 : 00 . 000       98            72            170           72 



Вообще четыре строки выдало.

Не катит также
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select min(t1.moment) as moment, 
min(t2.first) as first,
min(t3.last) as last,
max(t1.hight) as hight,
min(t1.low) as low
from abc t1 
join
(select * from abc where datediff(minute,@moment,moment)%@period= 0 ) t2
on 
datepart(minute,t1.moment)>=datepart(minute,t2.moment)
and
datepart(minute,t1.moment)<datepart(minute,t2.moment)+@period
join
(select * from abc where datediff(minute,@moment,moment)%@period=@period- 1 ) t3
on 
datepart(minute,t1.moment)>=datepart(minute,t3.moment)
and
datepart(minute,t1.moment)<datepart(minute,t3.moment)+@period

group by datediff(minute,@moment,t1.moment)/@period

Хотя я не врубаюсь почему

А вот так - катит, но нельзя получить последнее измерение
[src]
select min(t1.moment) as moment,
min(t2.first) as first,
min(t1.low) as low,
max(t1.Hight) as hight
from abc t1
join
(select * from abc where datediff(minute,@moment,moment)%@period=0) t2
on
datepart(minute,t1.moment)>=datepart(minute,t2.moment)
and
datepart(minute,t1.moment)<datepart(minute,t2.moment)+@period

group by datediff(minute,@moment,t1.moment)/@period
[src]
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071703
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще четыре строки выдало.
Ну так и должно быть 4.
Если 1 час "нарезать" по 3 минуты, то и получатся диапазоны
(13)-14-15, 16-17-18, 19-20-21, 22-(23)-(24)

Если же идет о "нарезке" начиная от минимальной даты в таблице, то тогда мой вариант действительно не катит.
А насчет "значения за минуту упорядочены по возрастанию" так это как раз и не важно.
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071706
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> GLory.
Точно. Я начал решать с "TOP 1", но что-то меня заклинило.

Твой запрос можно преобразовать для работы от минимальной даты

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @moment datetime
declare @period int
declare @delta int
select @moment=min(moment) from abc
set @period= 3 
set @delta=datediff(minute,convert(char( 8 ),@moment, 112 ),@moment)%@period
select @delta

select * from abc
select min(moment), 
(select top  1  [first] from abc b where (datepart(n,b.moment)-@delta)/@period = (datepart(n,a.moment)-@delta)/@period order by moment) as first,
(select top  1  [last] from abc b where (datepart(n,b.moment)-@delta)/@period = (datepart(n,a.moment)-@delta)/@period order by moment desc)as last, 
max([hight]) as hight,min([low])as low
from abc a
group by (datepart(n,moment)-@delta)/@period


Все хокей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
moment                      first       last        hight       low         
 --------------------------- ----------- ----------- ----------- ----------- 
 
 2002 - 11 - 24   16 : 28 : 00 . 000       36            85            121           36 
 2002 - 11 - 24   16 : 29 : 00 . 000       37            57            94            37 
 2002 - 11 - 24   16 : 30 : 00 . 000       82            55            137           55 

 2002 - 11 - 24   16 : 31 : 00 . 000       56            29            85            29 
 2002 - 11 - 24   16 : 32 : 00 . 000       43            70            113           43 
 2002 - 11 - 24   16 : 33 : 00 . 000       49            25            74            25 

 2002 - 11 - 24   16 : 34 : 00 . 000       8             8             16            8 
 2002 - 11 - 24   16 : 35 : 00 . 000       8             95            103           8 
 2002 - 11 - 24   16 : 36 : 00 . 000       81            38            119           38 

 2002 - 11 - 24   16 : 37 : 00 . 000       94            52            146           52 

                            first       last        hight       low         
 --------------------------- ----------- ----------- ----------- ----------- 
 
 2002 - 11 - 24   16 : 28 : 00 . 000       36            55            137           36 
 2002 - 11 - 24   16 : 31 : 00 . 000       56            25            113           25 
 2002 - 11 - 24   16 : 34 : 00 . 000       8             38            119           8 
 2002 - 11 - 24   16 : 37 : 00 . 000       94            52            146           52 
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071709
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В постинге от 24.11 15:28 я ошибся. Пересечение действительно будет
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071711
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Группировака временного ряда
    #32071713
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот перевод
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировака временного ряда
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]