Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Настенька Member Откуда: Норильск Сообщений: 939 |
Всем доброго дня. Вот привожу пример таблицы (сервер MS SQL 2000)DECLARE @t TABLE (id INT, name varchar(100)) INSERT INTO @t SELECT 1, 'тест' UNION ALL SELECT 2, 'Марина' UNION ALL SELECT 3, 'дождь' UNION ALL SELECT 4, 'азбука' UNION ALL SELECT 5, 'квартира' SELECT * FROM @t Задача такая, в этой таблице надо добавить поле дополнительное с именем rang (виртуальное), и в этом поле сделать нумерацию по возрастанию, исходя из того, что данные должны быть остортированы по полю name по возрастанию. Сложность в том, что нельзя использовать в запросе order by. Надо как-то сделать это без него. Помогите пожалуйста. В итоге должна быть вот такая таблица:
Заранее всем спасибо. |
|||||||||||||||||||
10 авг 17, 11:20 [20712935] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47061 |
Настенька, если вы стоите в очереди за картошкой, то как присваиваете себе номер? Наверно, считаете всех, кто стоит ближе вас к картошке? Вот и здесь можно так же. |
10 авг 17, 11:23 [20712945] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Настенька,
|
||
10 авг 17, 11:24 [20712947] Ответить | Цитировать Сообщить модератору |
Настенька Member Откуда: Норильск Сообщений: 939 |
Просто это один из кусков запроса, далее будет как раз кусок с order by, поэтому именно этот запрос должен быть без order by. Два order by же не может быть в запросе. |
10 авг 17, 11:28 [20712958] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Загнать содержимое в массив, отсортировать массив, присвоить индекс массива совпадающим по значению полям. Вывести поле rang первым. |
||
10 авг 17, 11:29 [20712962] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Настенька,
это уже слишком... |
||
10 авг 17, 11:30 [20712966] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
для свято верующих, sql не гаранитреут никакой порядок без явного указания ORDER BY тчк |
||||
10 авг 17, 11:31 [20712969] Ответить | Цитировать Сообщить модератору |
Yuri Abele Member Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe Сообщений: 1661 |
ROW_NUMBER, RANK и DENSE_RANK тоже используют ORDER BY, при этом их можно использовать в подзапросе. |
||
10 авг 17, 11:35 [20712981] Ответить | Цитировать Сообщить модератору |
Настенька Member Откуда: Норильск Сообщений: 939 |
У меня SQL Server 2000 |
||
10 авг 17, 11:38 [20712993] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47061 |
Можно же её прочитать. |
||||
10 авг 17, 12:13 [20713114] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47061 |
|
||||
10 авг 17, 12:14 [20713119] Ответить | Цитировать Сообщить модератору |
Yuri Abele Member Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe Сообщений: 1661 |
или так: SELECT * FROM ( select count (test_2.id) as rn, test_1.id, test_1.name from @t as test_1 inner join @t as test_2 on test_1.name >= test_2.name group by test_1.id, test_1.name ) T ORDER BY rn Или так - уродство, но работает: SELECT * FROM ( select TOP(100) PERCENT count (test_2.id) as rn, test_1.id, test_1.name from @t as test_1 inner join @t as test_2 on test_1.name >= test_2.name group by test_1.id, test_1.name order by rn ) T P.S. идея для RANK взята из FAQ (способ №2) |
||
10 авг 17, 12:20 [20713143] Ответить | Цитировать Сообщить модератору |
Настенька Member Откуда: Норильск Сообщений: 939 |
Спасибо огоромное, буду пробовать |
10 авг 17, 12:27 [20713162] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
Если это не тестовая задача, то скажите, что с этим условием сделать нельзя.
|
||||
10 авг 17, 15:30 [20713839] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
DECLARE @t TABLE (id INT, name varchar(100)) INSERT INTO @t SELECT 1, 'тест' UNION ALL SELECT 2, 'Марина' UNION ALL SELECT 3, 'дождь' UNION ALL SELECT 4, 'азбука' UNION ALL SELECT 7, 'азбука' UNION ALL SELECT 8, 'азбука' UNION ALL SELECT 5, 'квартира' UNION ALL SELECT 6, 'квартира' ;with r as ( select id,name,1 rang from @t t where not exists (select * from @t tt where t.name>tt.name or (t.name=tt.name and tt.id<t.id)) union all select t.id,t.name,rang+1 from r join @t t on r.name<t.name or (r.name=t.name and r.id<t.id) where not exists (select * from @t tt where (r.name<tt.name or (r.name=tt.name and r.id<tt.id)) and (t.name>tt.name or (t.name=tt.name and tt.id<t.id and tt.id>r.id))) ) select * from r OPTION(MAXRECURSION 0) |
10 авг 17, 16:18 [20714074] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
Хммм, а рекурсивный CTE в 2000 есть? Вроде нет, печаль :) |
10 авг 17, 16:21 [20714085] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
там просто вообще никакого CTE нет |
||
10 авг 17, 16:22 [20714100] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
DECLARE @t TABLE (id INT, name varchar(100)) INSERT INTO @t SELECT 1, 'тест' UNION ALL SELECT 2, 'Марина' UNION ALL SELECT 3, 'дождь' UNION ALL SELECT 4, 'азбука' UNION ALL SELECT 7, 'азбука' UNION ALL SELECT 8, 'азбука' UNION ALL SELECT 5, 'квартира' UNION ALL SELECT 6, 'квартира' select id,name, (select COUNT(*)+1 from @t tt where tt.name<t.name or (tt.name=t.name and tt.id<t.id)) from @t t Все проще намного :( |
10 авг 17, 16:36 [20714155] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Rankatan, главное серверу такое не показывать, а то как стошнит |
10 авг 17, 16:39 [20714163] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
От COUNT(*) ? |
||
10 авг 17, 16:47 [20714183] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Rankatan, от миллиона ваших count |
10 авг 17, 16:49 [20714190] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
Это стандартное решение для 2000, там оконных функций нет. Поэтому 2000 сервер вам ничего не скажет, он привык. |
||
10 авг 17, 16:55 [20714207] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
та да, судя по форуму сервер вообще привык к любому идиотизму |
||||
10 авг 17, 17:07 [20714232] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Я знаю. |
||
10 авг 17, 17:24 [20714282] Ответить | Цитировать Сообщить модератору |
Yuri Abele Member Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe Сообщений: 1661 |
Алексей, если эксперемента ради, внимательно прочитать все постинги, то Вы найдёте упоминание о том, что это только часть запроса (подзапрос) и поэтому нельзя использовать ORDER BY. Я показал как это ограничение обойти. |
||
11 авг 17, 11:18 [20716058] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |