Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];

Вниз

Формирование строки   Найти похожие ветки 

 
kaini   (2011-03-04 05:21) [0]

Здравствуйте, мастера!
Уж долгое время не могу решить одну задачу. Есть таблица с записями:
1999
2000
2001
2003
2005
2006
2007
....

Надо перевести в следующий вид:
1999-2001, 2003, 2005-2007, ...
и сохранить в другой таблице.
Подскажите пожалуйста!
Спасибо!


 
И. Павел ©   (2011-03-04 08:29) [1]

Сперва выбрать все данные, упорядочив их по дате. А потом First + whine not eof ... Next. Значение даты на предыдущем шаге итерации сохраняем и сравниваем с текущем. Если отличается больше, чем на год, то формируем интервал XXXX-XXXX и начинаем формировать новый интервал, сохранив ее начальную дату. Если нужно, могу расписать в виде программы. Но позже...


 
Кщд   (2011-03-04 09:20) [2]

>kaini   (04.03.11 05:21)  
СУБД?


 
Боброжелатель   (2011-03-04 10:10) [3]

function form_string(filename: string): string;

 procedure appendresult(start, finish: integer);
 begin
   if result <> "" then
     result := result + ", ";
   if start = finish then
     result := result + inttostr(start)
   else
     result := result + inttostr(start) + "-" + inttostr(finish)
 end;

var
 finish: integer;
 next: integer;
 start: integer;
 f: text;
begin
 result := "";
 assign(f, filename);
 reset(f);
 try
   if not eof(f) then
   begin
     readln(f, start);
     finish := start;
     while not eof(f) do
     begin
       readln(f, next);
       if (next - finish) <> 1 then
       begin
         appendresult(start, finish);
         start := next;
       end;
       finish := next;
     end;
     appendresult(start, finish);
   end;
 finally
    closefile(f);
 end;
end;


 
Кщд   (2011-03-04 10:22) [4]

>Боброжелатель   (04.03.11 10:10) [3]
1999
2006
2000
2001
2003
2005
2007


 
Боброжелатель   (2011-03-04 10:25) [5]

> Кщд   (04.03.11 10:22) [4]
> 1999
> 2006
> 2000
> 2001
> 2003
> 2005
> 2007


Исходные данные не соответствуют поставленной автором вопроса задаче.
Отсортируешь - тогда и приходи.


 
Кщд   (2011-03-04 10:33) [6]

>Боброжелатель   (04.03.11 10:10) [3]
слово "файл" Вы заметили между строк?)
у меня позиция простая: если в ответе приводят код, то он должен быть рабочим.
никому не навязываю и обсуждать это не собираюсь.


 
Боброжелатель   (2011-03-04 10:39) [7]

у меня позиция простая: если в ответе приводят код, то он должен быть рабочим.

Он рабочий.

слово "файл" Вы заметили между строк?

Автор вопроса не уточнял механизм хранения "таблицы". Как, впрочем, и определение того, что он подразумевает под "таблицей".

У меня позиция простая: не нравится приведенный код, приведи свой.


 
Кщд   (2011-03-04 10:51) [8]

>Боброжелатель   (04.03.11 10:39) [7]
до уточнения автора приводить код - бессмысленно)


 
Anatoly Podgoretsky ©   (2011-03-04 10:58) [9]


> слово "файл" Вы заметили между строк?)

Что бы это заметить нужна пара поллитр.
Автор просто не умеет правильно задавать вопросы.


 
Боброжелатель   (2011-03-04 11:41) [10]

> Кщд   (04.03.11 10:51) [8]

type
 readvaluefunc = function(out value: integer): boolean;
 writevalueproc = procedure(value: integer);
 writeintervalproc = procedure(start, finish: integer);

procedure compact(readfunc: readvaluefunc; writevalue: writevalueproc; writeinterval: writeintervalproc);
var
 finish: integer;
 next: integer;
 start: integer;

 procedure writeresult;
 begin
   if start = finish then
     writevalue(start)
   else
     writeinterval(start, finish);
 end;

begin
 if readfunc(start) then
 begin
   finish := start;
   while readfunc(next) do
   begin
     if (next - finish) <> 1 then
     begin
       writeresult;
       start := next;
     end;
     finish := next;
   end;
   writeresult;
 end;
end;


 
Очень злой   (2011-03-10 14:55) [11]

Как вариант, можно, что-то типа этого

SELECT   CONCAT (TO_CHAR (a.YEAR), NVL ((SELECT "-" FROM mytable WHERE YEAR = a.YEAR + 1), ","))
  FROM mytable a
  WHERE NOT EXISTS (SELECT NULL FROM mytable WHERE YEAR = a.YEAR + 1)
     OR NOT EXISTS (SELECT NULL FROM mytable WHERE YEAR = a.YEAR - 1)
ORDER BY a.YEAR


тогда из этого:
1999
2000
2001
2003
2005
2006
2007
получим такое:
1999-
2001,
2003,
2005-
2007,

А дальше можно собрать все в одну строку, удалить последнюю зяпятую и "засунуть" в другую таблицу.


 
Кщд   (2011-03-11 18:31) [12]

>Очень злой   (10.03.11 14:55) [11]
в Oracle можно получить требуемое именно в таком виде, как нужно автору, и всего лишь одним проходом по таблице
про небрежные альясы(alias) у таблиц лучше промолчать)

информация к размышлению:

select k.fyear, k.fyear - row_number() over (order by k.fyear) group_id
from sometable k



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
2-1300115458
Сергей
2011-03-14 18:10
2011.06.19
Как преобразовать данные прочитанные с com порта?


6-1238266942
mreg
2009-03-28 22:02
2011.06.19
Пример отправки post запроса + ответ на Winapi


2-1299768007
harisma
2011-03-10 17:40
2011.06.19
Слияние двух стринглистов


3-1260890661
man Yury
2009-12-15 18:24
2011.06.19
Странный результат при выполнении хранимой процедуры


15-1299060395
Scott Storch
2011-03-02 13:06
2011.06.19
Цифровая подпись





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский