Гость
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом / 10 сообщений из 10, страница 1 из 1
16.03.2016, 15:33
    #39193413
Teck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Есть две таблицы:

T1:
startperiodendperiodvalue12015-01-012015-12-31102016-01-012016-12-3120

T2:
startperiodendperiodvalue22015-01-102015-02-151502015-02-162015-07-211702015-07-222016-03-041902016-03-052016-10-30210

Обе непрерывны по периодам (каждая след. запись начинается на плюс один день от предыдущей). Первая всегда больше второй (по полю endperiod).
Необходимо вторую таблицу разделить первой полем endperiod:

startperiodendperiodvalue2value12015-01-102015-02-15150102015-02-162015-07-21170102015-07-222015-12-31NULL102016-01-012016-03-04190202016-03-052016-10-3021020

Вроде просто, но возникает проблема, когда во второй таблице есть запись, где endperiod = 2015-12-31.
Можно ли добиться результата одним запросом?
...
Рейтинг: 0 / 0
16.03.2016, 15:51
    #39193437
Teck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Teck,
Забыл: ASA 12.0.1
...
Рейтинг: 0 / 0
17.03.2016, 05:51
    #39193986
Помогите с запросом
Teck,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select GREATER(t1.startperiod, t2.startperiod) as x_startperiod
     , LESSER(t1.endperiod, t2.endperiod) as x_endperiod
     , case
         when t1.endperiod > t2.endperiod
           then t2.value2
         else null 
       end as value2
     , t1.value1
  from t1
  join t2
    on t1.endperiod >= t2.startperiod
   and t2.endperiod >= t1.startperiod
 order by x_startperiod
...
Рейтинг: 0 / 0
17.03.2016, 12:33
    #39194256
Teck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый Э - Эх,

Спасибо, но не работает, если во второй таблице во второй строке endperiod = 2015-12-31. В этом случае на выходе должно остаться 4 строки, т.к. совпадает endperiod.
...
Рейтинг: 0 / 0
17.03.2016, 12:48
    #39194276
Помогите с запросом
TeckДобрый Э - Эх,

Спасибо, но не работает, если во второй таблице во второй строке endperiod = 2015-12-31. В этом случае на выходе должно остаться 4 строки, т.к. совпадает endperiod.приведи набор данных, на котором "не работает", и желаемый результат на этих данных.
...
Рейтинг: 0 / 0
17.03.2016, 13:54
    #39194395
Teck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый Э - Эх,

Если во второй таблице во второй строке 2015-07-21 заменить на 2015-12-31, то должно получиться так:

startperiodendperiodvalue2value12015-01-102015-02-15150102015-02-162015-12-31170102016-01-012016-03-04190202016-03-052016-10-3021020
...
Рейтинг: 0 / 0
18.03.2016, 12:41
    #39195278
Помогите с запросом
Teck,

тогда немного сложнее:

Код: 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.
select GREATER(t1.startperiod, t2.startperiod) as x_startperiod
     , LESSER(t1.endperiod, t2.endperiod) as x_endperiod
     , t3.value2, t1.value1
  from t1
  join 
     (-- Свёртка пересекающихся периодов (T2):
       select min(startperiod) as startperiod, max(endperiod) as endperiod, min(value2) as value2
         from 
            (
              select startperiod, endperiod, value2
                   , sum(sog) over(order by startperiod,endperiod) as grp_id
               from 
                  (
                    select startperiod, endperiod, value2,
                           case 
                             when max(endperiod) 
                                 over(order by startperiod, endperiod 
                                       rows between unbounded preceding
                                                and 1 preceding) >= startperiod
                               then 0 
                             else 1 
                           end as sog -- sog = start_of_group :)
                      from t2
                  )
            )
          group by grp_id
       )t2
    on t1.endperiod >= t2.startperiod
   and t2.endperiod >= t1.startperiod
  left join t2 t3
    on LESSER(t1.endperiod, t2.endperiod) = t3.endperiod
 order by x_startperiod
...
Рейтинг: 0 / 0
18.03.2016, 18:21
    #39195671
Teck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый Э - Эх,

И правда сложнее, но работает)
А что делает конструкция:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select startperiod, endperiod, value2,
                           case 
                             when max(endperiod) 
                                 over(order by startperiod, endperiod 
                                       rows between unbounded preceding
                                                and 1 preceding) >= startperiod
                               then 0 
                             else 1 
                           end as sog -- sog = start_of_group :)
                      from t2

?

PS: в t2 гарантировано периоды непрерывны и не пересекаются.
...
Рейтинг: 0 / 0
18.03.2016, 19:10
    #39195730
Помогите с запросом
TeckА что делает конструкция:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select startperiod, endperiod, value2,
                           case 
                             when max(endperiod) 
                                 over(order by startperiod, endperiod 
                                       rows between unbounded preceding
                                                and 1 preceding) >= startperiod
                               then 0 
                             else 1 
                           end as sog -- sog = start_of_group :)
                      from t2

? Помечает флагом начала непрерывных непересекающихся интервалов, которые получатся после схлопывания пересекающихся интервалов из исходных данных

TeckPS: в t2 гарантировано периоды непрерывны и не пересекаются.Это утверждение противоречит вот этому "дополнению" к "техническому заданию":TeckДобрый Э - Эх,

Если во второй таблице во второй строке 2015-07-21 заменить на 2015-12-31, то должно получиться так:Потому как после такой замены в аккурат возникнут пересекающиеся интервалы: [2015-02-16, 2015-12-31] и [2015-07-22, 2016-03-04] (второй и третий интервал во второй таблице станут пересекаться в интервале дат от 2015-07-22 до 2015-12-31)
...
Рейтинг: 0 / 0
19.03.2016, 12:27
    #39195970
Teck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый Э - Эх,

Точно :(
не уточнил, что в случае замены автоматически изменяется дата начала периода в следующей строке.
В любом случае, работает как надо, спасибо!
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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