powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / H2 DB селект с группировкой дат
5 сообщений из 5, страница 1 из 1
H2 DB селект с группировкой дат
    #37592959
Homer_J_Simpson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, помогите пожалуйста написать запрос для решения следующей задачи:
Есть данные следующего вида:
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
H2 DB селект с группировкой дат
    #37594348
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Homer_J_Simpson,
Код: plaintext
2011-12-20 00:08:00.0	2011-12-20 00:17:00
.0
пожалуйста.
...
Рейтинг: 0 / 0
H2 DB селект с группировкой дат
    #37594373
Homer_J_Simpson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, точно, допустил ошибку в ожидаемых данных, должно быть:
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
H2 DB селект с группировкой дат
    #37594620
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Код: 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
H2 DB селект с группировкой дат
    #37595583
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
первый подправил
Код: 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
5 сообщений из 5, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / H2 DB селект с группировкой дат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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