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

Есть таблица:
CREATE TABLE customers_job
( id number(10) NOT NULL,
idCstomer number(10) NOT NULL,
dDate date NOT NULL,
idJob number(10) NOT NULL,
idCateg number(10) NOT NULL
);

Каждый день по idCustomer создаётся запись с датой dDate c инфой по текущим Job и Categ.
Причём сначала он может работать с одним Job и Categ, потом несколько дней с другими, а потом опять с первыми

idCustomerdDateidJob idCateg101.01.201711102.01.201711103.01.201721104.01.201711105.01.201721.... 131.01.201721201.01.201722202.01.201732...


Нужно сгруппировать данные так, чтобы выбрать диапазоны дат с характеристиками Customer.
Например:
idCustomerdDate1dDate2idJobidCateg101.01.201702.01.201711103.01.201703.01.201721104.01.201704.01.201711105.01.201731.01.201721201.01.201701.01.201721 ....
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546037
finish of group
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defunct,

match recognize
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546052
defunct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oracle 11.
match recognize вроде только в 12 появился?
Как можно без него старыми методами?
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546056
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defunctКак можно без него старыми методами?Ивертируй имя гостя и вбей в поиск.
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546132
На скуль.ру день ото дня всё интересней..... вот уже и шарады с ребусами нужно отгадать для получения ответа на поставленный вопрос... :) что дальше? Конкурс танцев, пение и выразительное чтение стишков?
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546152
megaexpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если совсем первое, что приходит в голову, то вот так:
with
v1 as
(
select row_number() over (order by dDate) rn, v.* from customers_job v
),
v2 as
(
select v1.*
, (select min(rn) from v1 v11 where rn<=v1.rn and v11.idCustomer=v1.idCustomer and v11.idJob=v1.idJob and not exists(select 1 from v1 v111 where v111.rn between v11.rn and v1.rn and (v111.idJob!=v1.idJob or v111.idCateg!=v1.idCateg) ) ) upperRn
, (select max(rn) from v1 v11 where rn>=v1.rn and v11.idCustomer=v1.idCustomer and v11.idJob=v1.idJob and not exists(select 1 from v1 v111 where v111.rn between v1.rn and v11.rn and (v111.idJob!=v1.idJob or v111.idCateg!=v1.idCateg) ) ) lowerRn
from v1
)
select
distinct v2.idCustomer, (select ddate from v2 v22 where rn=v2.upperRn) dDate1, (select ddate from v2 v22 where rn=v2.lowerRn) dDate2, v2.idJob, v2.idCateg
from v2
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546168
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
megaexpertАпломб и в имени не соответствует какашке в ответе.
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546173
megaexpert,

Тебе бы тоже не помешало отгадать ребусную шараду и родить годное решение.....
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546188
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхНа скуль.ру день ото дня всё интересней..... вот уже и шарады с ребусами нужно отгадать для получения ответа на поставленный вопрос... :) что дальше? Конкурс танцев, пение и выразительное чтение стишков?

шо не так?
вроде все понятно

или Вы о
finish of group --> start_of_group?

......
stax
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546299
Staxили Вы о
finish of group --> start_of_group?о-га, примерно об этом :)
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546334
defunct, megaexpert,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
-- 
-- Тестовый набор данных:
with customers_job as
  (
    select 1 as idCustomer, to_date('01.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('02.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('03.01.2017','dd.mm.yyyy') as dDate, 2 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('04.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('05.01.2017','dd.mm.yyyy') as dDate, 2 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('31.01.2017','dd.mm.yyyy') as dDate, 2 as idJob, 1 as idCateg from dual union all
    select 2 as idCustomer, to_date('01.01.2017','dd.mm.yyyy') as dDate, 2 as idJob, 2 as idCateg from dual union all
    select 2 as idCustomer, to_date('02.01.2017','dd.mm.yyyy') as dDate, 3 as idJob, 2 as idCateg from dual 
  )
--
-- Основной запрос:
select idCustomer, min(dDate) as dDate1, max(dDate) as dDate2, idJob, idCateg
  from (
         select t.*
              , row_number() over(partition by idCustomer, idJob, idCateg order by dDate) -
                row_number() over(partition by idCustomer, idCateg order by dDate) as grp_id
           from customers_job t
       ) v
 group by idCustomer, idJob, idCateg, grp_id
 order by idCustomer, min(dDate)

online проверка на sqlfiddle.com
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546403
defunct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,
большое спасибо за помощь в разгадке ребусов, буду разбираться
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39546544
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

возможно в partition by idCustomer, idCateg
idCateg лишнее

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

idCateg лишнее, т.к. с ним чередующиеся по idCateg диапазоны схлопываются, например, на таком примере первые несколько диапазонов:
Код: sql
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.
with customers_job as
  (
    select 1 as idCustomer, to_date('01.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('02.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('03.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 2 as idCateg from dual union all
    select 1 as idCustomer, to_date('04.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('05.01.2017','dd.mm.yyyy') as dDate, 2 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('06.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('07.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('08.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 2 as idCateg from dual union all
    select 1 as idCustomer, to_date('31.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 2 as idCustomer, to_date('01.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 2 as idCustomer, to_date('02.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 2 as idCustomer, to_date('03.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 2 as idCateg from dual
  )
--
-- Основной запрос:
select idCustomer, 
       min(dDate) as dDate1, 
       max(dDate) as dDate2, 
       idJob, idCateg
  from (
         select t.*
              , row_number() over(partition by idCustomer, idJob, idCateg order by dDate) -
                row_number() over(partition by idCustomer/*, idCateg*/ order by dDate) as grp_id
           from customers_job t
       ) v
group by idCustomer, idJob, idCateg, grp_id
order by idCustomer, min(dDate)



Воспользовавшись советом решить ту же задачу через start of group, у меня получились правильные диапазоны, но есть сомнения в выделенном тексте. Везде в примерах start-of_group там используется partition by-order by, а у меня так верные диапазоны не выходят - схлопываются. Наверное, нужно какое-то другое условие для определения начала группы?
Код: sql
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.
-- Тестовый набор данных:
with customers_job as
  (
    select 1 as idCustomer, to_date('01.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('02.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('03.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 2 as idCateg from dual union all
    select 1 as idCustomer, to_date('04.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('05.01.2017','dd.mm.yyyy') as dDate, 2 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('06.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('07.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 1 as idCustomer, to_date('08.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 2 as idCateg from dual union all
    select 1 as idCustomer, to_date('31.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 2 as idCustomer, to_date('01.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 2 as idCustomer, to_date('02.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 1 as idCateg from dual union all
    select 2 as idCustomer, to_date('03.01.2017','dd.mm.yyyy') as dDate, 1 as idJob, 2 as idCateg from dual
  )
-- Основной запрос:
select 
    idCustomer, idJob, idCateg, nGrp,
    to_char(min(dDate),'dd.mm.yyyy') as dMinDate,
    to_char(max(dDate),'dd.mm.yyyy') as dMaxDate
from(
  select
    idCustomer, dDate, idJob, idCateg,
    sum(sog) over (order by idCustomer, idJob, idCateg, dDate) as nGrp
  from
    (select
       idCustomer, dDate, idJob, idCateg,
       lag(dDate) over (partition by idCustomer, idJob, idCateg order by dDate) as dLagdDate,
       case when 
          dDate - 1 = lag(dDate) over (partition by idCustomer, idJob, idCateg order by dDate)
          then 0 
          else 1 
       end as sog
     from customers_job )
  order by idCustomer, dDate 
  ) 
group by idCustomer, idJob, idCateg, nGrp
order by idCustomer, min(dDate)
...
Рейтинг: 0 / 0
по дате сгруппировать данные по диапазонам
    #39548263
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defunct,

запутались в partition i order by

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


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