Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / H2 DB селект с группировкой дат / 5 сообщений из 5, страница 1 из 1
26.12.2011, 07:34
    #37592959
Homer_J_Simpson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
H2 DB селект с группировкой дат
Здравствуйте, помогите пожалуйста написать запрос для решения следующей задачи:
Есть данные следующего вида:
datetext_value2011-12-20 00:02:00.0 value12011-12-20 00:05:00.0value12011-12-20 00:12:00.0value12011-12-20 00:08:00.0value22011-12-20 00:11:00.0value22011-12-20 00:14:00.0value22011-12-20 00:17:00.0value22011-12-20 00:20:00.0value22011-12-20 00:23:00.0value2
Нужно сгруппировать данные по датам так, чтобы между двумя соседними датами, которые попадают в одну группу был интервал не более 5 минут. Ожидается следующий результат:
text_valuestart_dateend_datevalue12011-12-20 00:02:00.02011-12-20 00:05:00.0value12011-12-20 00:12:00.02011-12-20 00:12:00.0value22011-12-20 00:08:00.02011-12-20 00:17:00.0value22011-12-20 00:20:00.02011-12-20 00:23:00.0
Заранее спасибо.
...
Рейтинг: 0 / 0
26.12.2011, 21:44
    #37594348
V&N
V&N
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
H2 DB селект с группировкой дат
Homer_J_Simpson,
Код: plaintext
2011-12-20 00:08:00.0	2011-12-20 00:17:00
.0
пожалуйста.
...
Рейтинг: 0 / 0
26.12.2011, 22:04
    #37594373
Homer_J_Simpson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
H2 DB селект с группировкой дат
Да, точно, допустил ошибку в ожидаемых данных, должно быть:
text_valuestart_dateend_datevalue12011-12-20 00:02:00.02011-12-20 00:05:00.0value12011-12-20 00:12:00.02011-12-20 00:12:00.0value22011-12-20 00:08:00.02011-12-20 00:23:00.0
...
Рейтинг: 0 / 0
27.12.2011, 03:11
    #37594620
V&N
V&N
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
H2 DB селект с группировкой дат
Код: 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.
 drop table test;
create table test (dt timestamp, val varchar(10) );

insert into test values 
('2011-12-20 00:02:00.0','value1'), 
('2011-12-20 00:05:00.0','value1'), 
('2011-12-20 00:12:00.0','value1'), 
('2011-12-20 00:08:00.0','value2'), 
('2011-12-20 00:11:00.0','value2'), 
('2011-12-20 00:14:00.0','value2'), 
('2011-12-20 00:17:00.0','value2'), 
('2011-12-20 00:20:00.0','value2'), 
('2011-12-20 00:23:00.0','value2'); 

 -------------------------------------------------------------------------------------
/*var1 ЛАЖА*/
------------------------------------------------------------------------------------- 
set @m_val=null;
set @m_LastDate=null;
set @m_MinDate=null;
SELECT val, StartDate, MAX(EndtDate) AS EndtDate 
FROM (SELECT val, 
             CASE WHEN NOT COALESCE((val = @m_val AND dt BETWEEN  @m_LastDate AND TIMESTAMPADD('MINUTE',  5, @m_LastDate) ), FALSE) 
                  THEN SET(@m_MinDate, dt) ||SET(@m_LastDate, dt) || SET(@m_val, val)||'1' 
                  WHEN COALESCE(dt BETWEEN  @m_LastDate AND TIMESTAMPADD('MINUTE',  5, @m_LastDate) , FALSE) 
                  THEN '0'||SET(@m_MinDate, LEAST(dt, @m_LastDate, @m_MinDate))||SET(@m_LastDate, dt)||SET(@m_val, val)||'2' 
                  ELSE SET(@m_LastDate, dt) ||'0' 
              END AS foo, 
           @m_MinDate AS StartDate, 
           dt AS EndtDate 
      FROM test) foo 
GROUP BY val, StartDate 
ORDER BY val, StartDate;
 VAL  	STARTDATE  	ENDTDATE   
value1	2011-12-20 00:02:00.0	2011-12-20 00:05:00.0
value1	2011-12-20 00:12:00.0	2011-12-20 00:12:00.0
value2	2011-12-20 00:08:00.0	2011-12-20 00:23:00.0
 -------------------------------------------------------------------------------------
/*var2 лажа - см. доку extract и т.д. и т.п.*/
------------------------------------------------------------------------------------- 
select val, min(dt) as dt1, max(dt) as dt2 
  from (select *, case when /*лажа*/mn > 5 then 1 else 0 end vl 
          from (select *,/*лажа*/ 
                       extract(mi from coalesce((select min(b.dt) 
                                                   from test b 
                                                  where b.val=a.val 
                                            and b.dt>= a.dt), dt)) 
                     - extract(mi from coalesce((select max(b.dt) 
                                                from test b 
                                               where b.val=a.val 
                                                 and b.dt< a.dt), dt)) mn 
                  from test a) 
) 
group by val, vl 
order by val, dt1;
 VAL  	DT1  	DT2   
value1	2011-12-20 00:02:00.0	2011-12-20 00:05:00.0
value1	2011-12-20 00:12:00.0	2011-12-20 00:12:00.0
value2	2011-12-20 00:08:00.0	2011-12-20 00:23:00.0



пионерам сегодня везет ...
...
Рейтинг: 0 / 0
27.12.2011, 16:45
    #37595583
V&N
V&N
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
H2 DB селект с группировкой дат
первый подправил
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
set @m_val=null;
set @m_LastDate=null;
set @m_MinDate=null;
SELECT val, StartDate, MAX(EndtDate) AS EndtDate 
FROM (SELECT val, 
             CASE WHEN NOT COALESCE((val = @m_val AND dt BETWEEN  @m_LastDate AND TIMESTAMPADD('MINUTE',  5, @m_LastDate) ), FALSE) 
                  THEN SET(@m_MinDate, dt) ||SET(@m_LastDate, dt) || SET(@m_val, val)||'1' 
                  WHEN COALESCE(dt BETWEEN  @m_LastDate AND TIMESTAMPADD('MINUTE',  5, @m_LastDate) , FALSE) 
                  THEN '0'||SET(@m_MinDate, LEAST(dt, @m_LastDate, @m_MinDate))||SET(@m_LastDate, dt)||SET(@m_val, val)||'2' 
                  ELSE SET(@m_LastDate, dt) ||'0' 
              END AS foo, 
           @m_MinDate AS StartDate, 
           dt AS EndtDate 
      FROM (SELECT * 
              FROM test
             ORDER BY val, dt)) foo 
GROUP BY val, StartDate 
ORDER BY val, StartDate;

второй не правильный но может подойдет :)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select val, min(dt) as dt1, max(dt) as dt2 
  from (select *, 
               case when mn > 5 
                    then dt 
                end vl 
          from (select *,
                       datediff('minute',
                                 coalesce((select max(b.dt) 
                                             from test b 
                                            where b.val=a.val 
                                              and b.dt< a.dt), dt),                       
                                 coalesce((select min(b.dt) 
                                             from test b 
                                            where b.val=a.val 
                                              and b.dt>= a.dt), dt) ) as mn
                          from test a))  
group by val, vl 
order by val, dt1;

...
Рейтинг: 0 / 0
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / H2 DB селект с группировкой дат / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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