Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / по дате сгруппировать данные по диапазонам / 15 сообщений из 15, страница 1 из 1
01.11.2017, 14:20
    #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
01.11.2017, 14:26
    #39546037
finish of group
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
по дате сгруппировать данные по диапазонам
defunct,

match recognize
...
Рейтинг: 0 / 0
01.11.2017, 14:37
    #39546052
defunct
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
по дате сгруппировать данные по диапазонам
oracle 11.
match recognize вроде только в 12 появился?
Как можно без него старыми методами?
...
Рейтинг: 0 / 0
01.11.2017, 14:39
    #39546056
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
по дате сгруппировать данные по диапазонам
defunctКак можно без него старыми методами?Ивертируй имя гостя и вбей в поиск.
...
Рейтинг: 0 / 0
01.11.2017, 15:37
    #39546132
по дате сгруппировать данные по диапазонам
На скуль.ру день ото дня всё интересней..... вот уже и шарады с ребусами нужно отгадать для получения ответа на поставленный вопрос... :) что дальше? Конкурс танцев, пение и выразительное чтение стишков?
...
Рейтинг: 0 / 0
01.11.2017, 15:49
    #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
01.11.2017, 15:57
    #39546168
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
по дате сгруппировать данные по диапазонам
megaexpertАпломб и в имени не соответствует какашке в ответе.
...
Рейтинг: 0 / 0
01.11.2017, 15:59
    #39546173
по дате сгруппировать данные по диапазонам
megaexpert,

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

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

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

......
stax
...
Рейтинг: 0 / 0
01.11.2017, 17:57
    #39546299
по дате сгруппировать данные по диапазонам
Staxили Вы о
finish of group --> start_of_group?о-га, примерно об этом :)
...
Рейтинг: 0 / 0
01.11.2017, 18:52
    #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
01.11.2017, 20:37
    #39546403
defunct
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
по дате сгруппировать данные по диапазонам
Добрый Э - Эх,
большое спасибо за помощь в разгадке ребусов, буду разбираться
...
Рейтинг: 0 / 0
02.11.2017, 10:13
    #39546544
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
по дате сгруппировать данные по диапазонам
Добрый Э - Эх,

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

.....
stax
...
Рейтинг: 0 / 0
05.11.2017, 21:26
    #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
06.11.2017, 09:25
    #39548263
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
по дате сгруппировать данные по диапазонам
defunct,

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

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


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