Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Прошу помочь с сортировкой!  [new]
Андрей___Р
Member

Откуда:
Сообщений: 9
SQL 2005, SP3, 90

Есть задача по нумерации определенных полей бд. Просьба не отсылать к факам и тп. Если у кого-то есть вариант решения - помогите. Уточню, если есть, вообще, метод решения без "костылей"?

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

История вопроса: есть внешнее приложение на делфи, работающее с скуль-сервером, исходников нет, разобраться с происхождением бага нет возможности, но он периодически случается и почему-то путает данные (в приложении). Т.е. сегодня таблица выводится правильно и отчет по ней строится корректно, через месяц порядок строк нарушается и приходится все выправлять руками...

Таблица вида:

sqlCode lineCode lineText numSort
1000 2 текст_стр1 1
1000 4 текст_стр2 2
1000 110 текст_стр3 3
1000 6 текст_стр4 3
1000 120 текст_стр5 3
1000 100 текст_стр6 4
1000 36 текст_стр7 4
1000 8 текст_стр8 5
1000 12 текст_стр9 5
1000 18 текст_стр10 6

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

Задача:
пройтись по строкам в таком виде, как они есть, пронумеровать numSort по возрастанию с шагом 1, но если есть дублирование номера сортировки (их может быть несколько с одним номером), то смотреть на lineCode, если он больше, то и numSort тоже больше.

в си бы сделал все через цикл, пузырьковой сортировкой, например...
в скуль пока не великий специалист, поэтому от вариантов решения пухнет голова :)

Спасибо заранее! :)
6 дек 09, 18:42    [8025681]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
Андрей___Р
Member

Откуда:
Сообщений: 9
sqlCodelineCodelineTextnumSort
10002текст_стр11
10004текст_стр22
1000110текст_стр33
10006текст_стр43
1000120текст_стр53
1000100текст_стр64
100036текст_стр74
10008текст_стр85
100012текст_стр95
100018текст_стр106
6 дек 09, 18:48    [8025693]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
Gogachka
Member

Откуда:
Сообщений: 47
Андрей___Р,

сорри, не совсем понял вопрос, по какому полю нужно сортировать,по lineText?
как должна выглядеть таблица после установки numSort?
6 дек 09, 19:23    [8025761]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31194
Андрей___Р
пройтись по строкам в таком виде, как они есть, пронумеровать numSort по возрастанию с шагом 1, но если есть дублирование номера сортировки (их может быть несколько с одним номером), то смотреть на lineCode, если он больше, то и numSort тоже больше.

в си бы сделал все через цикл, пузырьковой сортировкой, например...
в скуль пока не великий специалист, поэтому от вариантов решения пухнет голова :)
Например, так:

update [ваша таблица]
set numSort = row_number() over(order by numSort, lineCode)
6 дек 09, 19:29    [8025766]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
Андрей___Р
Member

Откуда:
Сообщений: 9
alexeyvg,

Сообщение 4108, уровень 15, состояние 1, строка 6
Оконные функции могут использоваться только в предложениях SELECT или ORDER BY.
7 дек 09, 08:48    [8026357]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
Андрей___Р
Member

Откуда:
Сообщений: 9
Gogachka,

по numSort, numSort не уникально, при дублировании номера numSort - смотрим на lineCode, соответственно распределяем numSort

после этого я поправлю lineCode с каким-нить шагом, например 2 (надо так)

таблица должна стать такой:
sqlCodelineCodelineTextnumSort
10002текст_стр11
10004текст_стр22
10006текст_стр33
10008текст_стр44
100010текст_стр55
100012текст_стр66
100014текст_стр77
100016текст_стр88
100018текст_стр99
100020текст_стр1010
7 дек 09, 08:56    [8026376]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Вот вам с шагом 2:
with q as (select *, row_number() over(order by numSort, lineCode) rn from [ваша таблица])
update q set numSort = rn*2
7 дек 09, 09:40    [8026490]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31194
Андрей___Р
alexeyvg,

Сообщение 4108, уровень 15, состояние 1, строка 6
Оконные функции могут использоваться только в предложениях SELECT или ORDER BY.
Ну да, нужно с подзапросом или, как написал Anddros, с CTE
7 дек 09, 10:26    [8026708]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помочь с сортировкой!  [new]
Андрей___Р
Member

Откуда:
Сообщений: 9
Anddros,

ОК, спасибо большое - это работает
7 дек 09, 11:15    [8027104]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить