powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом
12 сообщений из 12, страница 1 из 1
Помогите с запросом
    #39247501
storysoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите с запросом необходимо проранжировать и сгруппировать интервалы времени по группам N минут.

Исходные данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
id    time
1     15.10
2     15.11
3     15.15
4     15.16
5     15.17
6     15.55
7     15.58



Необходимо сгруппировать например по 5 минут и вывести номер группы максимальную и минимальную дату

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Н.гр    id     min_t      max_t
  1      1     15.10      15.15
  1      2     15.10      15.15
  1      3     15.10      15.15
  2      4     15.16      15.17
  2      5     15.16      15.17
  3      6     15.55      15.58
  3      7     15.55      15.58
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247525
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исходный данные в каком формате?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247526
storysoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxисходный данные в каком формате?
id - number
time - date
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247530
storysoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще необходима вторая выборка, когда интервал между датами не превышает например 1 минуты.

Исходные данные

id time
1 15.10
2 15.11
3 15.11
4 15.12
5 15.15
6 15.16
7 15.19
8 15.55
9 15.58




На выходе должно получиться следующее
Н.гр id min_t max_t
1 1 15.10 15.12
1 2 15.10 15.12
1 3 15.10 15.12
1 4 15.10 15.12
2 5 15.15 15.16
2 6 15.15 15.16

Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247531
storysoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще необходима вторая выборка, когда интервал между датами не превышает например 1 минуты.

Исходные данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
id   time
1   15.10
2   15.11
3   15.11
4   15.12
5   15.15
6   15.16
7   15.19
8   15.55
9   15.58





На выходе должно получиться следующее
Код: sql
1.
2.
3.
4.
5.
6.
7.
Н.гр   id      min_t   max_t
1       1      15.10   15.12
1       2      15.10   15.12
1       3      15.10   15.12
1       4      15.10   15.12
2       5      15.15   15.16
2       6      15.15   15.16



Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247546
вот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
storysoft, группы сформировать смог, дальше никак:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with s as (select rownum id, s.LAST_ACTIVE_TIME dat from v$sql s where rownum<1000),
     s_per as (select 5 prd from dual),
     s_min as (select Trunc(min(dat), 'HH24') dat from s),
     s_max as (select Trunc(max(dat), 'HH24')+1/24 dat from s),
     s_cnt as (select ((select dat from s_max)-(select dat from s_min))*24*60/(select prd from s_per) cnt from dual),
     s_int as (select (select dat from s_min)+(select prd from s_per)* rownum   /24/60 int1,
                      (select dat from s_min)+(select prd from s_per)*(rownum+1)/24/60 int2
                 from dual connect by level<(select cnt from s_cnt))

select * from s, s_int where s.dat between s_int.int1 and s_int.int2 order by 2
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247550
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with d as
(
select date '2016-6-1' + rownum / 605 d
  from dual
  connect by rownum < 21)
select d, grp, 
       dense_rank() over(order by grp) dr
  from(
select d,
       trunc(d)+trunc((d-trunc(d))*24*12)/24/12 grp
  from d
  )

DGRPDR01/06/2016 0:02:2301/06/2016101/06/2016 0:04:4601/06/2016101/06/2016 0:07:0801/06/2016 0:05:00201/06/2016 0:09:3101/06/2016 0:05:00201/06/2016 0:11:5401/06/2016 0:10:00301/06/2016 0:14:1701/06/2016 0:10:00301/06/2016 0:16:4001/06/2016 0:15:00401/06/2016 0:19:0201/06/2016 0:15:00401/06/2016 0:21:2501/06/2016 0:20:00501/06/2016 0:23:4801/06/2016 0:20:00501/06/2016 0:26:1101/06/2016 0:25:00601/06/2016 0:28:3401/06/2016 0:25:00601/06/2016 0:30:5701/06/2016 0:30:00701/06/2016 0:33:1901/06/2016 0:30:00701/06/2016 0:35:4201/06/2016 0:35:00801/06/2016 0:38:0501/06/2016 0:35:00801/06/2016 0:40:2801/06/2016 0:40:00901/06/2016 0:42:5101/06/2016 0:40:00901/06/2016 0:45:1301/06/2016 0:45:001001/06/2016 0:47:3601/06/2016 0:45:0010остальное сможешь?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247694
storysoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
А как во втором случае определить группу, получается итоговый интервал заранее неизвестен, выбрал все записи у которых интервал не превышает 5 минуты таким образом. Как определить группу для каждого?


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with table1 as
    (
      select to_date('30.05.2016 10:00','dd.mm.yyyy hh24:mi') as DTIME, '1' as id from dual union all 
      select to_date('30.05.2016 10:04','dd.mm.yyyy hh24:mi') as DTIME, '2' as id from dual union all 
      select to_date('30.05.2016 10:05','dd.mm.yyyy hh24:mi') as DTIME, '3' as id from dual union all
      select to_date('30.05.2016 10:07','dd.mm.yyyy hh24:mi') as DTIME, '4' as id from dual union all      
      select to_date('30.05.2016 10:25','dd.mm.yyyy hh24:mi') as DTIME, '5' as id from dual union all 
      select to_date('30.05.2016 10:31','dd.mm.yyyy hh24:mi') as DTIME, '6' as id from dual union all
      select to_date('30.05.2016 10:50','dd.mm.yyyy hh24:mi') as DTIME, '7' as id from dual union all
      select to_date('30.05.2016 10:55','dd.mm.yyyy hh24:mi') as DTIME, '8' as id from dual union all
      select to_date('30.05.2016 10:57','dd.mm.yyyy hh24:mi') as DTIME, '8' as id from dual 
    )
select  a1.ID from table1 a1
  where exists (
	select null from table1 b1
	where b1.ID <> a1.ID and 
          (
            (b1.DTIME >= a1.DTIME and b1.DTIME <= a1.DTIME+5/24/60) 
          or 
          (b1.DTIME >= a1.DTIME-5/24/60 and b1.DTIME <= a1.DTIME)
          )
      )
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247716
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ты ищешь цепочки, то вот пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH table1 AS
(
      SELECT TO_DATE('30.05.2016 10:00','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL 
      SELECT TO_DATE('30.05.2016 10:04','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL 
      SELECT TO_DATE('30.05.2016 10:05','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL
      SELECT TO_DATE('30.05.2016 10:07','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL      
      SELECT TO_DATE('30.05.2016 10:25','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL 
      SELECT TO_DATE('30.05.2016 10:31','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL
      SELECT TO_DATE('30.05.2016 10:50','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL
      SELECT TO_DATE('30.05.2016 10:55','dd.mm.yyyy hh24:mi') D FROM dual UNION ALL
      SELECT TO_DATE('30.05.2016 10:57','dd.mm.yyyy hh24:mi') D FROM dual 
)
SELECT d, rn, SUM(grp) OVER(ORDER BY rn) grp
FROM(
SELECT d, row_number() OVER(ORDER BY d) rn,
       CASE WHEN d-lag(d) OVER(ORDER BY d) <= 5/24/60 THEN 0 ELSE 1 END grp
  FROM table1 T
)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39247843
storysoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,

Спасибо, то что нужно. Единственное не понял как SUM(grp) OVER(ORDER BY rn) распределяет по группам
...
Рейтинг: 0 / 0
Помогите с запросом
    #39249574
storysoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите еще запрос. Необходимо выбрать записи в которых в которых сумма в группе превышает определенное значение

Пробовал через sum(summa) OVER(partition by grp order by date), но это дает только нарастающий итог, а необходимо получить итоговую сумму все группы для каждой записи этой группы.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39249615
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
storysoftПодскажите еще запрос. Необходимо выбрать записи в которых в которых сумма в группе превышает определенное значение

Пробовал через sum(summa) OVER(partition by grp order by date), но это дает только нарастающий итог, а необходимо получить итоговую сумму все группы для каждой записи этой группы.

sum(summa) OVER(partition by grp)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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