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

Откуда:
Сообщений: 54
Возможно ли создать запрос, который вместо

AAAA 5 cc 12
AAAA 6 bb 7
AAAA 3 dd 9
BBBB 9 bb 10
BBBB 8 aa 15
BBBB 3 cc 8

выводил бы таблицу в виде

AAAA 5 cc 12
6 bb 7
3 dd 9
BBBB 9 bb 10
8 aa 15
3 cc 8

То есть чтобы значения поля в первом (а в принципе - в любом) столбце не повторялись.
Спасибо.
22 фев 12, 12:18    [12136007]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5116
и что должно быть в первом поле для "повторов"?
22 фев 12, 12:24    [12136050]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iljy
Member

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

;with cte(a,b,c,d) as(
select 'AAAA', 5, 'cc', 12 union all
select 'AAAA', 6, 'bb', 7 union all
select 'AAAA', 3, 'dd', 9 union all
select 'BBBB', 9, 'bb', 10 union all
select 'BBBB', 8, 'aa', 15 union all
select 'BBBB', 3, 'cc', 8
)
select case ROW_NUMBER() over(partition by a order by (select 1)) when 1 then a else '' end a, b,c,d
from cte
22 фев 12, 12:25    [12136066]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
zago
Member

Откуда:
Сообщений: 54
В первом поле вместо повторов должна быть пустая строка
22 фев 12, 12:30    [12136103]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
делить на два СТЕ, и потом left джоинить
22 фев 12, 12:31    [12136110]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy,

общий ORDER BY ещё должен быть
22 фев 12, 12:31    [12136111]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap
iljy,

общий ORDER BY ещё должен быть

Это я так, для примера. Там много неясностей - типа как строки внутри группы сортировать? Если распространять на остальные поля - как это должно выглядеть? Ну и т.п.
22 фев 12, 12:34    [12136149]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
zago
Member

Откуда:
Сообщений: 54
Вариант iljy полностью устраивает.
Остается единственная проблема с сортировкой.
Если я задаю ORDER BY a, то сначала идут пустые строки, а не так как я указал на примере.
22 фев 12, 12:48    [12136255]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iljy
Member

Откуда:
Сообщений: 8711
zago
Если я задаю ORDER BY a, то сначала идут пустые строки, а не так как я указал на примере.

А как вы его задаете?
22 фев 12, 12:50    [12136278]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
zago
Member

Откуда:
Сообщений: 54
ORDER BY a,b

В этом случае получается

3 dd 9
6 bb 7
AAAA 5 cc 12
3 cc 8
8 aa 15
BBBB 9 bb 10

DESC в данном случае тоже не помогает.
22 фев 12, 12:56    [12136323]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iljy
Member

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

ORDER BY выпоняется после SELECT, а в списке первое поле тоже имеет имя a. Для сортировки по исходному полю укажите явно полное имя.
22 фев 12, 12:58    [12136343]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
zago,

ORDER BY ROW_NUMBER()OVER(...)
22 фев 12, 12:58    [12136345]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap
zago,

ORDER BY ROW_NUMBER()OVER(...)

не-а
22 фев 12, 13:00    [12136361]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy
zago,

ORDER BY выпоняется после SELECT, а в списке первое поле тоже имеет имя a. Для сортировки по исходному полю укажите явно полное имя.
Так не получится.
Ведь одинаковые значения первого исходного поля не соответсвуют
желаемому упорядочиванию результата, ибо некая "первая" из них
уже имеет особый смысл, заданный ROW_NUMBER()ом...
22 фев 12, 13:02    [12136380]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy
iap
zago,

ORDER BY ROW_NUMBER()OVER(...)

не-а
Почему?
22 фев 12, 13:03    [12136394]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iap
Member

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

не-а
Почему?
До иеня дошло!
;with cte(a,b,c,d) as(
select 'AAAA', 5, 'cc', 12 union all
select 'AAAA', 6, 'bb', 7 union all
select 'AAAA', 3, 'dd', 9 union all
select 'BBBB', 9, 'bb', 10 union all
select 'BBBB', 8, 'aa', 15 union all
select 'BBBB', 3, 'cc', 8
)
,t as(select n=ROW_NUMBER() over(partition by a order by (select 1)),* from cte)
select case n when 1 then a else '' end a, b,c,d
from t
order by t.a,n;
22 фев 12, 13:08    [12136450]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
zago
Member

Откуда:
Сообщений: 54
Вариант

select case ROW_NUMBER() over(partition by a order by (select 1)) when 1 then a else '' end a, b,c,d
from cte
order by case ROW_NUMBER() over(partition by a order by (select 1)),b

переносит все строки с первым пустым столбцом в конец списка
22 фев 12, 13:10    [12136478]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
zago
Вариант

select case ROW_NUMBER() over(partition by a order by (select 1)) when 1 then a else '' end a, b,c,d
from cte
order by case ROW_NUMBER() over(partition by a order by (select 1)),b

переносит все строки с первым пустым столбцом в конец списка
Чо-то как-то неопределённо с сортировкой по SELECT 1
Оно точно будет вычисляться всегда один раз?
Я поэтому второе CTE и написал. Для гарантии.
22 фев 12, 13:16    [12136532]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
zago,

Вам же уже сказали, что в ORDER BY a - это уже не первоначальная a, а весь CASE селекта!
22 фев 12, 13:18    [12136544]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с уникальным значением в одном столбце  [new]
zago
Member

Откуда:
Сообщений: 54
Вот последний вариант, который нормально работает

SELECT (CASE WHEN (ROW_NUMBER() OVER(PARTITION BY a ORDER BY a,b))=1 THEN a ELSE '' END) AS a,b,c,d
FROM cte t
ORDER BY t.a,ROW_NUMBER() OVER(PARTITION BY a ORDER BY a)

Всем спасибо за помощь.
22 фев 12, 15:41    [12137888]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить