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

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

необходимо построить аналогичный ряд, но по другому периоду. Например по 5 минут (аналогично первое, последнее, максимальное за 5 мин и минимальное)
Как сделать с курсорами понятно, а как сделать без курсоров? Тут по идее как-то группировкой можно обойтись...или нет?
...
Рейтинг: 0 / 0
23.11.2002, 18:13:44
    #32071639
Sergey A.Ledenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
Вот уж непонятнее вопроса я и не встречал. Нельзя ли поупорядоченнее?
...
Рейтинг: 0 / 0
23.11.2002, 18:34:08
    #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
23.11.2002, 18:46:06
    #32071642
Sergey A.Ledenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
Теперь лучше... Задача и впрямь интересная. Надо помозговать.
...
Рейтинг: 0 / 0
23.11.2002, 18:56:38
    #32071643
valmond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
Если я делаю GROUP , то я могу как-то обработать данные внутри группы (например взять первое значение одного поля и последнее значение другого поля)?
Не хранятся ли эти данные в каких-то временных таблицах?
...
Рейтинг: 0 / 0
23.11.2002, 19:23:38
    #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
23.11.2002, 19:39:18
    #32071646
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
блин... последнюю строку читать так:
Код: plaintext
group by (datepart(n,moment)- 1 ) 5 
...
Рейтинг: 0 / 0
23.11.2002, 20:48:55
    #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
23.11.2002, 21:28:35
    #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
24.11.2002, 14:05:22
    #32071689
valmond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
Но в таком случае обрабатывають данные можно только за час т.к. потом будет группировка пересекатся за разные часы.
...
Рейтинг: 0 / 0
24.11.2002, 14:10:56
    #32071690
valmond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
Понял.
надо просто изменить

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


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

Код: plaintext
group by convert(char( 13 ), moment,  121 ), (datepart(n,moment)- 1 )/@period
...
Рейтинг: 0 / 0
24.11.2002, 15:28:48
    #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
24.11.2002, 15:57:54
    #32071703
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
Вообще четыре строки выдало.
Ну так и должно быть 4.
Если 1 час "нарезать" по 3 минуты, то и получатся диапазоны
(13)-14-15, 16-17-18, 19-20-21, 22-(23)-(24)

Если же идет о "нарезке" начиная от минимальной даты в таблице, то тогда мой вариант действительно не катит.
А насчет "значения за минуту упорядочены по возрастанию" так это как раз и не важно.
...
Рейтинг: 0 / 0
24.11.2002, 16:25:58
    #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
24.11.2002, 17:00:32
    #32071709
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
В постинге от 24.11 15:28 я ошибся. Пересечение действительно будет
...
Рейтинг: 0 / 0
24.11.2002, 17:04:46
    #32071711
Дед Маздай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
...
Рейтинг: 0 / 0
24.11.2002, 17:34:58
    #32071713
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировака временного ряда
А вот перевод
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировака временного ряда / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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