Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 SQL-запрос (может просто, но в голову ничего не приходит)  [new]
vick057
Member

Откуда:
Сообщений: 44
Нужно сделать, именно, в SQL запросе.

Из таблицы:

ID DATE_BEG DATE_END
1 01.01.2006 14.01.2006
1 12.01.2006 16.01.2006
1 17.01.2006 19.01.2006
1 21.01.2006 23.01.2006
1 24.01.2006 31.01.2006


Получить таблицу:

ID DATE_BEG DATE_END
1 01.01.2006 19.01.2006
1 21.01.2006 31.01.2006

Т.е. сгруппировать по неразрывным интервалам.
16 фев 07, 11:32    [3795072]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос (может просто, но в голову ничего не приходит)  [new]
Станислав С
Guest
vick057
Нужно сделать, именно, в SQL запросе.

Из таблицы:

ID DATE_BEG DATE_END
1 01.01.2006 14.01.2006
1 12.01.2006 16.01.2006
1 17.01.2006 19.01.2006
1 21.01.2006 23.01.2006
1 24.01.2006 31.01.2006


Получить таблицу:

ID DATE_BEG DATE_END
1 01.01.2006 19.01.2006
1 21.01.2006 31.01.2006

Т.е. сгруппировать по неразрывным интервалам.

ИМХО, в SQL-запросе это не сделать, так как, по определению, SQL работает с множествами и порядок следования элементов множества может быть произвольным. Order By действует уже на результат выборки.
Именно для таких случаев используются разные "SQL-языки программирования" типа PL/SQL, T-SQL и т.д.

Твою задачу (правда для номеров телефонов, а не для дат, но это мелочи) я решил через Хранимую Процедуру (она на PL/SQL, но, думаю, разобраться несложно):
create or replace procedure Collapse is
teln1 tel_tmp.tl_n%type;
telk1 tel_tmp.tl_k%type;
teln2 tel_tmp.tl_n%type;
telk2 tel_tmp.tl_k%type;
idf1 tel_tmp.id_fao%type;
idf2 tel_tmp.id_fao%type;
cursor tmp is select distinct * from tel_tmp order by tl_n;

-- tel_tmp = исходная таблица (интервалы не свернуты)
-- telefons = итоговая таблица (интервалы свернуты)
-- tl_n = начало интервала; tl_k = конец интервала

begin

  delete from telefons;
  commit;
  
  open tmp;
  fetch tmp into teln1,telk1,idf1;
  
  loop
  begin
    fetch tmp into teln2,telk2,idf2;    
    exit when tmp%notfound;
    if (teln2-telk1)<=1 then
      if telk1<=telk2 then
       telk1:=telk2;
      end if;
    else
      insert into telefons(tl_n,tl_k,id_fao) values (teln1,telk1,idf1);
      teln1:=teln2;
      telk1:=telk2;
      idf1:=idf2;
    end if; 
  end;
  end loop;

  close tmp;
  
  insert into telefons(tl_n,tl_k,id_fao) values (teln1,telk1,idf1);  
  commit;
  
exception
   when others then
     sys.dbms_output.put_line('No data found');
    
end Collapse;
16 фев 07, 11:53    [3795305]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос (может просто, но в голову ничего не приходит)  [new]
vick057
Member

Откуда:
Сообщений: 44
Да, согласен с тобой, одним SQL не обойтись.

В алгоритме разобрался, реализовать не проблема.

Спасибо за помощь!
16 фев 07, 12:29    [3795702]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос (может просто, но в голову ничего не приходит)  [new]
Maltsev Max
Member

Откуда: Россия, Пермь
Сообщений: 352
Станислав С

ИМХО, в SQL-запросе это не сделать, так как, по определению, SQL работает с множествами и порядок следования элементов множества может быть произвольным. Order By действует уже на результат выборки.


Станислав С, В оракле есть замечательная функция OVER, которая

  • Не требует наличия Group By
  • Позволяет определить окно и сортировку в нем...

    Очень интересная функция ...
  • 16 фев 07, 14:31    [3796755]     Ответить | Цитировать Сообщить модератору
     Re: SQL-запрос (может просто, но в голову ничего не приходит)  [new]
    vick057
    Member

    Откуда:
    Сообщений: 44
    А в DB2 есть что-нибудь подобное?
    Over нету, я посмотрел.
    16 фев 07, 15:22    [3797172]     Ответить | Цитировать Сообщить модератору
     Re: SQL-запрос (может просто, но в голову ничего не приходит)  [new]
    Maltsev Max
    Member

    Откуда: Россия, Пермь
    Сообщений: 352
    vick057
    А в DB2 есть что-нибудь подобное?
    Over нету, я посмотрел.


    Нет.
    Это Оракловая фича ...
    19 фев 07, 12:42    [3804472]     Ответить | Цитировать Сообщить модератору
    Все форумы / FoxPro, Visual FoxPro Ответить