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

Откуда:
Сообщений: 6
Всем привет, возникли следующие вопросы по запросам к базе данных. Перерыл интернет, лаконичных решений не нашел, надеюсь на вашу помощь.

Есть таблица данных T1 следующего вида:

Номер | Машина | Модель
1 | Тойота | Камри
2 | Лексус | RX330
3 | Тойота | Королла
4 | Ниссан | Патрол
5 | Ниссан | Кашкай

В результате запроса нужно получить таблицу в которой только первые значения по столбцу Машина, повторы не выводить. Получить нужно такую таблица T2:

Номер | Машина | Модель
1 | Тойота | Камри
2 | Лексус | RX330
4 | Ниссан | Патрол

Я пробовал через DISTINCT и GROUP BY, но это работает только если вывожу один столбец Машина, если беру все столбцы таблицы, не работает. В сети находил решения, но все они трехэтажные, неужели нет простого решения?
21 сен 18, 05:56    [21681537]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
AlexCalm
Всем привет, возникли следующие вопросы по запросам к базе данных. Перерыл интернет, лаконичных решений не нашел, надеюсь на вашу помощь.

Есть таблица данных T1 следующего вида:

Номер | Машина | Модель
1 | Тойота | Камри
2 | Лексус | RX330
3 | Тойота | Королла
4 | Ниссан | Патрол
5 | Ниссан | Кашкай

В результате запроса нужно получить таблицу в которой только первые значения по столбцу Машина, повторы не выводить. Получить нужно такую таблица T2:

Номер | Машина | Модель
1 | Тойота | Камри
2 | Лексус | RX330
4 | Ниссан | Патрол

Я пробовал через DISTINCT и GROUP BY, но это работает только если вывожу один столбец Машина, если беру все столбцы таблицы, не работает. В сети находил решения, но все они трехэтажные, неужели нет простого решения?

двухэтажное с row_number()
одноэтажное с row_number () и top 1 with ties
Только вот зря вы эффективность решения по этажности оцениваете
21 сен 18, 06:11    [21681541]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
aleks222
Member

Откуда:
Сообщений: 849
with x as ( select Номер = min(Номер),  Машина from T1 group by  Машина )
  select T1.*
     from x left outer join T1 on T1.Номер = x.Номер and T1.Машина = x.Машина
21 сен 18, 06:29    [21681547]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
Щукина Анна
Member

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

TOP 1 WITH TIES с сортировкой по ROW_NUMBER() OVER(partition by Машина order by Номер)
21 сен 18, 06:56    [21681554]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
WITH CTE AS (SELECT N=ROW_NUMBER()OVER(PARTITION BY Машина ORDER BY Номер),* FROM T1)
SELECT * FROM CTE WHERE N=1;
21 сен 18, 10:35    [21681742]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
AlexCalm
Member

Откуда:
Сообщений: 6
Спасибо за помощь, но, как я понимаю, все предложенное выше использует колонку Номер. А если такой колонки нет?

Машина | Модель
Тойота | Камри
Лексус | RX330
Тойота | Королла
Ниссан | Патрол
Ниссан | Кашкай

Как получить такой результат в этом случае?

Машина | Модель
Тойота | Камри
Лексус | RX330
Ниссан | Патрол

PS Н-да, для элементарной вещи нет стандартной функции. Теперь боюсь даже спрашивать про аналог функции ВПР из екселя, там наверно 3 страницы кода будет.
21 сен 18, 10:39    [21681746]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
court
Member

Откуда:
Сообщений: 1956
AlexCalm
А если такой колонки нет?
Как получить такой результат в этом случае?
А вот в этом случае, от вас потребуется объяснение почему, например, для Тойота нужно оставить именно Камри, а не Королла ?

пс
сразу предупреждаю, ответ "потому что она первая" не канает :)
Эт тебе не Эксель ...
21 сен 18, 10:44    [21681750]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
AlexCalm
Спасибо за помощь, но, как я понимаю, все предложенное выше использует колонку Номер. А если такой колонки нет?

Машина | Модель
Тойота | Камри
Лексус | RX330
Тойота | Королла
Ниссан | Патрол
Ниссан | Кашкай

Как получить такой результат в этом случае?

Машина | Модель
Тойота | Камри
Лексус | RX330
Ниссан | Патрол

PS Н-да, для элементарной вещи нет стандартной функции. Теперь боюсь даже спрашивать про аналог функции ВПР из екселя, там наверно 3 страницы кода будет.
WITH CTE AS (SELECT N=ROW_NUMBER()OVER(PARTITION BY Машина ORDER BY Модель),* FROM T1)
SELECT * FROM CTE WHERE N=1;
А вообще, включите мозг. Достаточно понять, зачем в OVER() должен быть ORDER BY.
И не надо рыть Интернет - всё это есть на этом форуме. Было сто раз.
21 сен 18, 10:44    [21681751]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20181
AlexCalm
только первые значения по столбцу Машина
Понятие "первый" существует лишь после того, как указана сортировка по выражению, согласно которому записи уникальны:
court
пс
сразу предупреждаю, ответ "потому что она первая" не канает :)
Эт тебе не Эксель ...

Какая же используется сортировка в показанном примере?
21 сен 18, 11:18    [21681785]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20181
PS. Я нашёл возможную сортировку - ORDER BY [Машина],SUBSTRING([Модель],3,1). Но интуиция подсказывает, что на деле всё не так...
21 сен 18, 11:20    [21681788]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
Alibek B.
Member

Откуда:
Сообщений: 3517
AlexCalm
Как получить такой результат в этом случае?

— Скажите, пожалуйста, куда мне отсюда идти?
— А куда ты хочешь попасть? — ответил Кот.
— Мне все равно... — сказала Алиса.
— Тогда все равно, куда и идти, — заметил Кот.
— ...только бы попасть куда-нибудь, — пояснила Алиса.
— Куда-нибудь ты обязательно попадешь, — сказал Кот.
21 сен 18, 12:50    [21681899]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, убирающий повторы строк по значениям в одном стобце.  [new]
DaniilSeryi
Member

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

Вот это - трёхэтажный вариант или сойдёт?

select *
from t
inner join 
	(select min(Номер) as МН
	 from t
	 group by Машина
	) as a
on t.Номер=МН
order by Номер
23 сен 18, 21:00    [21683355]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить