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

Откуда:
Сообщений: 48
У меня есть таблица

Id UNIQUEIDENTIFIER
Num1 INT
Num2 INT


К примеру есть 3 записи:

guid_1 50 300
guid_2 60 300
guid_3 70 300


Мне нужно вывести первые 2 записи и потом их отсортировать по Num1 по убыванию.

SELECT TOP 2
*
FROM
t
ORDER BY t.Num1 DESC


При таком запросе выведет последние 2 записи. Как без подзапроса сделать корректный запрос? Если применять ROW_NUMBER, то какой ORDER BY ставить в нём?
21 авг 17, 13:01    [20738390]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Gric_Art
Как без подзапроса сделать корректный запрос?
Подзапросы религия запрещает использовать или преподаватель?
21 авг 17, 13:05    [20738405]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
TaPaK
Member

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

ORDER BY Id, Num1 DESC ?
21 авг 17, 13:10    [20738424]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
Gric_Art
Member

Откуда:
Сообщений: 48
Гавриленко Сергей Алексеевич
Gric_Art
Как без подзапроса сделать корректный запрос?
Подзапросы религия запрещает использовать или преподаватель?


Я написал с подзапросом, но подумал что возможно всё можно сделать красивее, поэтому и обратился сюда с вопросом.
21 авг 17, 13:10    [20738430]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
Gric_Art
Member

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

ORDER BY Id, Num1 DESC ?


В качестве id используется GUID.
21 авг 17, 13:11    [20738434]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
TaPaK
Member

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

ORDER BY Id, Num1 DESC ?


В качестве id используется GUID.

и что вы подразумеваете первыми двумя записями?
21 авг 17, 13:14    [20738469]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
Gric_Art
Member

Откуда:
Сообщений: 48
TaPaK
Gric_Art
пропущено...


В качестве id используется GUID.

и что вы подразумеваете первыми двумя записями?


Те, которые должны были бы вывестись, если бы не использовался ORDER BY.
Пытался гуглить что можно в ORDER BY подставить на 1-ую позицию, чтобы он работал как и без него вначале, а потом уже выполнял другие условия, но не нашёл.

Т.е. так:
ORDER BY условие_по_умолчанию, Num1
21 авг 17, 13:20    [20738512]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Gric_Art
TaPaK
пропущено...

и что вы подразумеваете первыми двумя записями?


Те, которые должны были бы вывестись, если бы не использовался ORDER BY.
Пытался гуглить что можно в ORDER BY подставить на 1-ую позицию, чтобы он работал как и без него вначале, а потом уже выполнял другие условия, но не нашёл.

Т.е. так:
ORDER BY условие_по_умолчанию, Num1

1. sql не гаранитирует никокой сортировки без явного указания ORDER BY
2. ORDER BY CASE WHEN THEN ELSE END, NUM1
21 авг 17, 13:22    [20738520]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20203
Gric_Art
Мне нужно вывести первые 2 записи
Понятие "первые" появляется только после того, как появится сортировка. таблица - это несортированная куча, без сортировки порядок записей не определён, даже если записи выводятся в каком-то порядке (в любой момент этот порядок имеет право измениться - без видимой причины и без уведомления).
21 авг 17, 13:52    [20738644]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Gric_Art, "красивее", точнее, проще - это подзапросом.

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

Вот вариант (по мотивам Бен-Гана):

declare @test table (
Id uniqueidentifier default (newsequentialid()),
Num1 int,
Num2 int
);

insert into @test (Num1, Num2)
values  (50, 300), (60, 300), (70, 300);

select top 2 with ties *
from @test as t 
order by  (row_number() over (order by t.Id) + 1) / 2, t.Num1 desc
21 авг 17, 14:24    [20738777]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
Minamoto
...
select top 2 with ties *
...


Вы можете в результате получить более 2 строк!
21 авг 17, 15:26    [20739074]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
SQL2008
Minamoto
...
select top 2 with ties *
...


Вы можете в результате получить более 2 строк!

это ты хелп открыл? и дальше не смотрел?
21 авг 17, 15:29    [20739095]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
TaPaK
SQL2008
пропущено...


Вы можете в результате получить более 2 строк!

это ты хелп открыл? и дальше не смотрел?

Специально для упоротых
declare @t table (id int )

insert into @t
select 1
union all
select 2
union all
select 2
union all
select 2
union all
select 3
union all
select 3

select top 2 with ties * from @t order by 1
21 авг 17, 15:54    [20739198]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
TaPaK
Member

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

специально для недалёких
автор
order by (row_number() over (order by t.Id) + 1) / 2, t.Num1 desc
21 авг 17, 15:58    [20739216]     Ответить | Цитировать Сообщить модератору
 Re: ORDER BY и TOP  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
TaPaK
SQL2008,

специально для недалёких
автор
order by (row_number() over (order by t.Id) + 1) / 2, t.Num1 desc

Отомстил да? Ну ладно, ошибся я... Признаю :)
21 авг 17, 16:01    [20739231]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить