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

Откуда: Норильск
Сообщений: 932
Всем доброго дня. Вот привожу пример таблицы (сервер 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. Надо как-то сделать это без него.
Помогите пожалуйста.

В итоге должна быть вот такая таблица:

id name rang
4 азбука 1
3 дождь 2
5 квартира 3
2 Марина 4
1 тест 5


Заранее всем спасибо.
10 авг 17, 11:20    [20712935]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Настенька,

если вы стоите в очереди за картошкой, то как присваиваете себе номер?
Наверно, считаете всех, кто стоит ближе вас к картошке?
Вот и здесь можно так же.
10 авг 17, 11:23    [20712945]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Настенька,

автор
о нельзя использовать в запросе order by.
что это за жизнь такая...
10 авг 17, 11:24    [20712947]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 932
Просто это один из кусков запроса, далее будет как раз кусок с order by, поэтому именно этот запрос должен быть без order by. Два order by же не может быть в запросе.
10 авг 17, 11:28    [20712958]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6026
Настенька
сделать нумерацию по возрастанию, исходя из того, что данные должны быть остортированы по полю name по возрастанию


Загнать содержимое в массив, отсортировать массив, присвоить индекс массива совпадающим по значению полям. Вывести поле rang первым.
10 авг 17, 11:29    [20712962]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Настенька,

автор
Просто это один из кусков запроса, далее будет как раз кусок с order by, поэтому именно этот запрос должен быть без order by. Два order by же не может быть в запросе.

это уже слишком...
10 авг 17, 11:30    [20712966]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
env
Настенька
сделать нумерацию по возрастанию, исходя из того, что данные должны быть остортированы по полю name по возрастанию


Загнать содержимое в массив, отсортировать массив, присвоить индекс массива совпадающим по значению полям. Вывести поле rang первым.

для свято верующих, sql не гаранитреут никакой порядок без явного указания ORDER BY тчк
10 авг 17, 11:31    [20712969]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Настенька
Просто это один из кусков запроса, далее будет как раз кусок с order by, поэтому именно этот запрос должен быть без order by. Два order by же не может быть в запросе.

ROW_NUMBER, RANK и DENSE_RANK тоже используют ORDER BY, при этом их можно использовать в подзапросе.
10 авг 17, 11:35    [20712981]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 932
автор
ROW_NUMBER, RANK и DENSE_RANK тоже используют ORDER BY, при этом их можно использовать в подзапросе.

У меня SQL Server 2000
10 авг 17, 11:38    [20712993]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Настенька
автор
ROW_NUMBER, RANK и DENSE_RANK тоже используют ORDER BY, при этом их можно использовать в подзапросе.

У меня SQL Server 2000
Есть же статья про нумерацию в FAQ!
Можно же её прочитать.
10 авг 17, 12:13    [20713114]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
iap
Настенька
пропущено...

У меня SQL Server 2000
Есть же статья про нумерацию в FAQ!
Можно же её прочитать.
И посчитать COUNTом записи перед текущей, как я уже намекнул, ведь ничего не мешает?
10 авг 17, 12:14    [20713119]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Настенька
У меня SQL Server 2000


или так:
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]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 932
Спасибо огоромное, буду пробовать
10 авг 17, 12:27    [20713162]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Настенька
отсортированы по полю name по возрастанию.
Сложность в том, что нельзя использовать в запросе order by. Надо как-то сделать это без него
"отсортированы" называется order by
Если это не тестовая задача, то скажите, что с этим условием сделать нельзя.
Yuri Abele
или так:
...
Или так - уродство, но работает:
...
Так у вас order by есть, а его нельзя использовать.
10 авг 17, 15:30    [20713839]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Хммм, а рекурсивный CTE в 2000 есть? Вроде нет, печаль :)
10 авг 17, 16:21    [20714085]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
o-o
Guest
Rankatan
Хммм, а рекурсивный CTE в 2000 есть? Вроде нет, печаль :)

там просто вообще никакого CTE нет
10 авг 17, 16:22    [20714100]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Rankatan,

главное серверу такое не показывать, а то как стошнит
10 авг 17, 16:39    [20714163]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Rankatan
Member

Откуда:
Сообщений: 250
TaPaK
Rankatan,

главное серверу такое не показывать, а то как стошнит

От COUNT(*) ?
10 авг 17, 16:47    [20714183]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Rankatan,

от миллиона ваших count
10 авг 17, 16:49    [20714190]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Rankatan
Member

Откуда:
Сообщений: 250
TaPaK
Rankatan,

от миллиона ваших count

Это стандартное решение для 2000, там оконных функций нет. Поэтому 2000 сервер вам ничего не скажет, он привык.
10 авг 17, 16:55    [20714207]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Rankatan
TaPaK
Rankatan,

от миллиона ваших count

Это стандартное решение для 2000, там оконных функций нет. Поэтому 2000 сервер вам ничего не скажет, он привык.

та да, судя по форуму сервер вообще привык к любому идиотизму
10 авг 17, 17:07    [20714232]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6026
TaPaK
sql не гаранитреут никакой порядок без явного указания ORDER BY

Я знаю.
10 авг 17, 17:24    [20714282]     Ответить | Цитировать Сообщить модератору
 Re: Добавление порядкового номера в поле для дальнейшей сортировки  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
alexeyvg
Так у вас order by есть, а его нельзя использовать.

Алексей, если эксперемента ради, внимательно прочитать все постинги, то Вы найдёте упоминание о том, что это только часть запроса (подзапрос) и поэтому нельзя использовать ORDER BY.
Я показал как это ограничение обойти.
11 авг 17, 11:18    [20716058]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить