Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хитрая сортировка 
:(
    Опции темы
Akella
  Дата 1.12.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Есть в базе 2 поля, которые заслуживают внимания в данном вопросе, остальные просто не нужны пока что.
Вот записи в базе могут быть отсортированы так:
Код

select * from treklama order by agency_sort

вот результат

Цитата

квартал
квартал
квартал
квартал
аверс
аверс


Теперь в поле ID_Sort требуется записать числовые значения таким образом, чтобы записи шли поочереди

Цитата

квартал
аверс
квартал
аверс
квартал
квартал



Для наглядности в экселе изобразил так:
user posted image

Не знаю, понятно ли?  smile

Добавлено @ 17:01
Т.е. как бы выхватывая из каждой группы записи, их нужно выстроить одну за другой. Может проще на Delphi соорудить?

Это сообщение отредактировал(а) Akella - 1.6.2012, 12:45
PM MAIL   Вверх
vladimir74
Дата 1.12.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 28.11.2006

Репутация: 2
Всего: 3



Цитата(Akella @  1.12.2008,  14:59 Найти цитируемый пост)
Т.е. как бы выхватывая из каждой группы записи, их нужно выстроить одну за другой. Может проще на Delphi соорудить?

это что один раз надо сохранить? тогда если 10 строк - то проще руками, если больше то быстее ИМХО на дельфях
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 1.12.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



пока что в базе всего около 65 тыщ объявлений

Добавлено через 2 минуты и 1 секунду
юзеры молятся smile , ибо если я не сделаю, то они будут сортировать ручками 65000 записей smile

Добавлено через 9 минут и 2 секунды
Пока делаю на дельфи

Тестирую, не знаю, что получиться

Принцип такой. Создаю нужное количество массивов. Потом цикл по массивам

Код

procedure TDM.SortByAgency();
Var
 q: array of TpFIBDataSet;
 i, k, k1:integer;
 aSQL: String;
begin

  tAgSort.Open;
  tAgSort.First;
  i := 0;
  //создаём нужное число НД (наборов данных)
  while not tAgSort.Eof do begin
    SetLength(q, i+1);
    q[i]                                    := TpFIBDataSet.Create(nil);
    q[i].Database                           := dbJDN;
    q[i].Transaction                        := trRead;
    q[i].UpdateTransaction                  := trUpdate;
//в массив только записи конкретного клиента 
    q[i].SelectSQL.Add('select * from treklama where id_agency = '+ tAgSort.FBN('ID').AsString);
    q[i].AutoUpdateOptions.UpdateTableName  := 'TREKLAMA';
    q[i].AutoUpdateOptions.GeneratorName    := 'GEN_TAGENCY_ID';
    q[i].AutoUpdateOptions.KeyFields        := 'ID';
    q[i].GenerateSQLs;
    q[i].Open;
    q[i].FetchAll;
    q[i].First;
    k := k + q[i].RecordCount;
    inc(i);
    tAgSort.Next;
  end;//while not tAgSort.Eof do begin

//по количеству записей 
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;//если в каком-то наборе закончились записи....
//наверное нужно внести сюда ещё одну переменную из-за наличие continue
      aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
    end;
  end;//for k1 := 0

  For i := 0 to High(q) do Freel(q[i]);//Freel = FreeAndNil

  SetLength(q, 0);
end;


PM MAIL   Вверх
Deniz
Дата 2.12.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Akella, что-то не совсем понятно, а можешь объяснить как-нибудь по другому?
Если есть 3 значения поля (квартал, аверс, жидн), которые идут друг за другом, причем тут группы?
И почему так много записей?
И по какому признаку это группируется?
Может все-таки еще какие-то поля будут учавствовать в алгоритме?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 2.12.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Deniz @  2.12.2008,  10:11 Найти цитируемый пост)
Если есть 3 значения поля (квартал, аверс), которые идут друг за другом, причем тут группы?

группы - это образно говоря, т.к. группы объявлений, группа объявлений от квартала, группа объявлений от ЖиДH`а, группа объявлений от Аверса, ну типа объявления могут сгруппированы/отсортированны по ID рекламодателя.

Добавлено @ 10:32
Цитата(Deniz @  2.12.2008,  10:11 Найти цитируемый пост)
И почему так много записей?

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



Это сообщение отредактировал(а) Akella - 1.6.2012, 12:45
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Разбиваем на массивы одинаковых слов, каждому элементу в пределах массива прописываем его порядковый номер, заносим в БД и запросом сортируем.

квартал 1
квартал 2
квартал 3

аверс    1
аверс    2

жидн    1

Код

select * from aaa  order by num, name 

получаем 

аверс    1
жидн    1
квартал    1

аверс    2
квартал    2

квартал    3


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
vladimir74
Дата 2.12.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 28.11.2006

Репутация: 2
Всего: 3



Akella,  у тебя получилось?
Цитата(Akella @  1.12.2008,  15:25 Найти цитируемый пост)
Принцип такой. Создаю нужное количество массивов. Потом цикл по массивам

в принципе я думал создать три квери, сделать цикл по размеру наибольшего, внутри апдейтить общим счетчиком ID проверяя на конец каждого квери последовательно  ...

Добавлено через 3 минуты и 12 секунд
Vas
я так понял ID станет  ключем. 

--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Deniz @  2.12.2008,  10:11 Найти цитируемый пост)
И по какому признаку это группируется?

ну я перед обработкой запихиваю группы объявлений в массив датасетов, выше на дельфи код:

Код

 q[i].SelectSQL.Add('select * from treklama where id_agency = '+ tAgSort.FBN('ID').AsString);


т.е. получается массив датасетов, в каждом датасете набор/группа объявлений от конкретного рекламодателя, т.е. 10 рекламодателей, и 10 датасетов в массиве получается

в q[0] объявления от Квартала
в q[1] объявления от Аверса
в q[2] объявления от ЖиДH
в q[3] объявления от ещё от кого-то там

Что нужно сделать?
Первой записи (в поле ID_SORT) датасета q[0] присваимваем 1
Первой записи (в поле ID_SORT) датасета q[1] присваимваем 2
Первой записи (в поле ID_SORT) датасета q[2] присваимваем 3

прошли все записи массива и опять
Второй записи (в поле ID_SORT) датасета q[0] присваимваем 4
Второй записи (в поле ID_SORT) датасета q[1] присваимваем 5
Второй записи (в поле ID_SORT) датасета q[0] присваимваем 6

и т.к.

Теперь когда мы отсортируем записи по полю ID_SORT, то получим такую чехарду, как показано на рисунке
user posted image


Это сообщение отредактировал(а) Akella - 1.6.2012, 12:46
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(vladimir74 @  2.12.2008,  10:39 Найти цитируемый пост)
я так понял ID станет  ключем. 

А смысл его делать ключом? Если и делать то составной (Name, ID_Sort).

Цитата(vladimir74 @  2.12.2008,  10:39 Найти цитируемый пост)
в принципе я думал создать три квери

А если не три разных наименования, а n-ое количество, причем заранее не известное smile


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(vladimir74 @  2.12.2008,  10:39 Найти цитируемый пост)
Akella,  у тебя получилось?

нет, намудрил я здесь
Код

//по количеству записей 
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;//если в каком-то наборе закончились записи....
//наверное нужно внести сюда ещё одну переменную из-за наличие continue
      aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
    end;
  end;//for k1 := 0


что-то не так, что-то забыл, логика у мну хромает, моск тоже хромает  smile 
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Akella @  2.12.2008,  10:51 Найти цитируемый пост)
Теперь когда мы отсортируем записи по полю ID_SORT, то получим такую чехарду, как показано на рисунке

А в пределах группы сортировка по наименованию не нужна?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Vas @  2.12.2008,  10:52 Найти цитируемый пост)
А если не три разных наименования, а n-ое количество, причем заранее не известное smile 

Вот именно, мало того, в каждом датасете свой количество объявлений:  от квартала 10, от аверса 50, от ЖиДH 1000.
PM MAIL   Вверх
vladimir74
Дата 2.12.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 28.11.2006

Репутация: 2
Всего: 3



перечитал свое, кажется с утра у меня плохл с формулировкой мыслей
Код

myMewID := 1;
for i:=0 to maxQueryRecord-1 do begin
  if not query1.eof do begin
      query1:= 'update .........';
     inc(myMewID);
     query1.next;
  end;
  if not query2.eof do begin
      query2:='update .........';
     inc(myMewID);
     query3.next;
  end;
  if not query3.eof do begin
      query2:= 'update .........';
     inc(myMewID);
     query3.next;
  end;
end;

ну вообщето эти три ифа должеы быть одной функцией, но это уже не принципиально, если речь идет о тулсе которую просто надо быстро запустить....
ИМХО конечно...

Это сообщение отредактировал(а) vladimir74 - 2.12.2008, 10:59
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Vas @  2.12.2008,  10:36 Найти цитируемый пост)
select * from aaa  order by num, name 

по идее никаких имён там нет, имя это я привёл для наглядности smile
и там вообще такая сортировка  smile , но это к делу не относится, всё отсортировано до вас smile , осталось отсортировать по последнему полю, но в поле нужно записать правильные значения, чтобы получилась правильная сортировка

Это сообщение отредактировал(а) Akella - 2.12.2008, 11:00
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Akella, а почему на сервере не хочешь сделать, насколько я замечал ты с БД дружишь. 
1. Выбираем строго наименования не повторяющиеся и делаем курсор по этому запросу
Код

select distinct name from table;

2. Цикл по выбранному курсору, внутри цикла выбираем все записи соответсвующие этой группе
Код

select * from table where name=curs.name;

3. Тоже объявляем курсор и внутри курсора апдейтим записи по порядку.
4. Затем сортируем как я уже писал.

Добавлено через 1 минуту и 34 секунды
Цитата(Akella @  2.12.2008,  10:57 Найти цитируемый пост)
по идее никакого имена там нет, имя это я привёл для наглядности

Дык не имя, а какой-то признак для разбивки по группам есть же? 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1303 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.