Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ORDER BY [D7, MSSQL]


Страницы:   1 2

VadimSpb ©   (2006-05-04 02:11:00) 

Добрый день!
Сортирую целые числа "... ORDER BY Flat"
Получаю:
0
4
44
456
5

Сделал иначе: "... ORDER BY CAST(Flat AS DOUBLE PRECISION)"
Получил как и нужно:
0
4
5
44
456

Почему такая "беда" при сортировке целых чисел в первом варианте?


VadimSpb   (2006-05-09 22:34:00) [1]

Shaman_Naydak   (09.05.06 20:28) [38]
Сделал универсальную хранимку на сервере. Все замечательно работает.
И не надо извратов в виде дополнительных полей. Спасибо!


VadimSpb   (2006-05-09 20:54:00) [2]

Действительно все просто :-))


Shaman_Naydak   (2006-05-09 20:28:00) [3]

Уважаемый... я не пытаюсь влезть в ваши хитроумные одиссейские способы в превращение в число с плавающей точкой..
Мой способ - простой и незатейливый как грабли.
У вас есть строковое поле квартир и вам надо его отсортировать в "правильном" порядке..
Для этого надо выравнять по правому краю.. для этого слева добиваются необходимым числом пробелов (у меня в примере) до 10. Вы проверьте код, пожалуйста, а уж потом будем дискутировать.


VadimSpb   (2006-05-09 20:18:00) [4]

Не все так просто как кажется ;-)))
И какой тип поля предполагаете?
Учтите, что 255 надо возводить в степень неоднократно


Shaman_Naydak   (2006-05-09 20:11:00) [5]

Мда.. Любитель, вы батенька поизвращаться..

А сортировать планировалось так:

Order by GetAlignedFlatNumber(FlatNumber)

Если уж вы так озабочены скоростью работы, а памяти вам не жалко,
то определите ф-цию с WITH SCHEMABINDING
Добавьте в таблицу вычисляемое поле FlatSort = GetAlignedFlatNumber(FlatNumber)
и создайте по этому полю индекс...
Удачи в извращениях.. я шучу ;)


VadimSpb   (2006-05-09 18:05:00) [6]

> Shaman_Naydak   (09.05.06 04:43) [33]

И как это планируется сортировать?

Остановился пока на идее Shirson ©   (06.05.06 14:03) [26]c некоторыми поправками. Привязываюсь к ASCII коду, 255 символов.
Число разрядов будет ограничено из-за быстрого увеличения результата вычислений, поэтому тип сортируемого поля выбрал DECIMAL(38,18) и делю на 1000000000000000000. Отладочный вариант:
 
DECLARE @y INT
DECLARE @n INT
DECLARE @HS DECIMAL(38,18)
DECLARE @Pos varchar(max)
DECLARE @TMP1 varchar(max)
SET @HS=0
SET @y=0
SET @TMP1= /edFlat.Text/  
SET @n=LEN(@TMP1)
WHILE @y<@n
 BEGIN
   SET @Pos=SUBSTRING(@TMP1,@y+1,1)
   SET @HS=@HS + (ISNULL(ASCII(@Pos)*(POWER(255,@n-1-@y)),0))/1000000000000000000
   SET @y=@y+1
 END
UPDATE Addresses SET FlatSort = @HS
WHERE AddressID= /IntToStr(AdrPOS)/


На 12 разрядов хватает, а боьше наверное и не надо для полностью универсального варианта. Учитываются буквы и цифры, национальная раскладка клавиатуры, верхний и нижний регистр. Вариант можно развить для оптимизации. Алгоритм нормально работает.


VadimSpb   (2006-05-09 17:52:00) [7]


> Shaman_Naydak   (09.05.06 04:43) [33]

И как это планируется сортировать?

Остановился пока на идее


Shaman_Naydak   (2006-05-09 04:43:00) [8]

CREATE FUNCTION GetAlignedFlatNumber(@FlatNumber varchar(32))
RETURNS varchar(32)
AS
BEGIN
 declare @Result varchar(32)
 declare @ind int
 if @FlatNumber is not null
 begin
   set @ind = PATINDEX('%[^0-9]%', @FlatNumber)
   if @ind = 0
     set @ind = LEN(@FlatNumber) + 1
   set @Result = REPLICATE(' ', 10 - @ind) + @FlatNumber
 end
 RETURN @Result
END


VadimSpb   (2006-05-07 11:38:00) [9]


> 123456789ABCDEFGHIJKLMNOP...
>
> 5С7G = 16(G) + 7*40 + 12(C)*40*40 + 5*40*40*40 = 339496
> 5С8A = 10 + 320 + 19200 + 320000 = 339530
> 6 = 6*40*40*40 = 384000
>
> Красота.

Красота здесь с ошибкой. Попробуйте вычислить 60. Или 100. А идея красивая :-)))


VadimSpb   (2006-05-06 23:38:00) [10]

Разве номер не м.б. 4a5b7c???


Anatoly Podgoretsky   (2006-05-06 20:51:00) [11]

VadimSpb   (06.05.06 13:42) [22]
Оно даже подразумевает, что это совсем не номер.


VadimSpb   (2006-05-06 19:34:00) [12]


> Shirson ©   (06.05.06 14:03) [26]

Пока представляется лучшим универсальным решением.
Я не циклюсь на 5А, И7 и т.д. Лучше всего иметь универсальный алгоритм. Завтра может понадобится:

> Особенно интересна ситуация 4a5b7c

Странно видеть такой разброс мнений по данной проблеме, предполагал, что номер квартиры, договора и т.п. д.б. сплошь и рядом. Значит решается все ограничениями для пользователя. Количество разрядов - наименьшее из зол. Да и взять можно с разумным запасом.
Спасибо всем.


Genry   (2006-05-06 14:15:00) [13]


> Johnmen ©   (06.05.06 14:06) [27]


> А я то сразу и не догадался


Скорей не догадался что автор не привел четкий алгоритм сортировки, который ему требуется. Либо мсье - телепат :-)


Johnmen   (2006-05-06 14:06:00) [14]


> Genry   (06.05.06 13:55) [25]
> Для тех условий что привел автор - верно.


А я то сразу и не догадался, что у автора только 4 квартиры: 1, 3, 333 и 5А.
:)


Shirson   (2006-05-06 14:03:00) [15]

5С можно представить как 5 + дробная часть, которая равна, скажем, ASCII-коду или чего-уж-там.
Т.е. 5С = 5.067, в то время как 333 = 333.000
Соответсвенно при сортировке получим
5С
333

Если же могут присутсвовать варианты 5С7G, то нужно определиться, "что старше", буква или цифра. Либо приводить запись к варианту "двусхотпятидесятитятиричности" :) для расширенного набора букв, а если только латинские,то хватит и "сорокаричности"
123456789ABCDEFGHIJKLMNOP...

5С7G = 16(G) + 7*40 + 12(C)*40*40 + 5*40*40*40 = 339496
5С8A = 10 + 320 + 19200 + 320000 = 339530
6 = 6*40*40*40 = 384000

Красота. Но для заранее ограниченного количества разрядов в записи


Genry   (2006-05-06 13:55:00) [16]


> Johnmen ©   (06.05.06 13:23) [19]


> Неверно.


Для тех условий что привел автор - верно.


Desdechado   (2006-05-06 13:46:00) [17]

Johnmen ©   (06.05.06 13:23) [19]
согласен
я ж дал эскиз :)

ANB ©   (06.05.06 13:30) [20]
бывают, и у нас тоже, особенно когда коммуналку повыкупают по частям, пробивают отдельный вход в каждую и, чтоб не сбивать нумерацию квартир в доме, просто буквы дописывают


Sergey13   (2006-05-06 13:45:00) [18]

Мне просто интересно - чем 2 поля для квартир не подходят?

>По сути данный вопрс принципиален. Есть еще поле "Номер договора", что также может подразумевать не только цифры ...

Тебе уже давали на него принципиальный ответ [12] Genry   (06.05.06 12:34)


VadimSpb   (2006-05-06 13:42:00) [19]

Бывают еще как!

По сути данный вопрс принципиален. Есть еще поле "Номер договора", что также может подразумевать не только цифры ...
Мой вопрос не оригинален, думаю многие с ним сталкиваются.

> Добавить ещё одно целочисленное поле "Порядок сортировки"
> и сортировать уже по нему.

Логично, надо поюзать.


Sergey13   (2006-05-06 13:38:00) [20]

2[20] ANB ©   (06.05.06 13:30)
В заграничных кинах постоянно мелькает 5С 7В - этаж+комната. 8-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо