powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом
10 сообщений из 10, страница 1 из 1
Помогите с запросом
    #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
Помогите с запросом
    #39193437
Teck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Teck,
Забыл: ASA 12.0.1
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #39194256
Teck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

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

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

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


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