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

Откуда:
Сообщений: 5
Добрый день, подскажите пожалуйста как заполнить таблицу

Есть таблица Pribor c 3 полями Номер изделия, Наименование и производитель, как выбрать приборы, например если у них одинаковый Number то выбрать TOP 1 (отсортированы при выборке по номеру, производителю и наименованию) и так для всех, чтобы получить выборку, где уникальные Number с параметрами Name и Proizvod из TOP 1

Number - Name - Proizvod

1050 - Фильтр грубой очистки - Simens
1050 - Фильтр грубой очистки - Bosh
1050 - Фильтр грубой очистки - Samsung
1120 - Кран запорный - BEKO
1120 - Кран запорный - AKAI
1235 - Смеситель - Samsung

Number - Name - Proizvod

1050 - Фильтр грубой очистки - Bosh
1120 - Кран запорный - AKAI
1235 - Смеситель - Samsung
29 мар 17, 14:31    [20346597]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
ElVencedor, как то так
select Number, Name, Proizvod, row_number() over(partition by Number order by Proizvod) as r
from (
select Number, Name, Proizvod, row_number(partition by Number order by Proizvod) as r
from  Pribor
) t
where r = 1
29 мар 17, 14:37    [20346656]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
ElVencedor, как то так
select Number, Name, Proizvod
from (
select Number, Name, Proizvod, row_number(partition by Number order by Proizvod) as r
from  Pribor
) t
where r = 1
29 мар 17, 14:37    [20346659]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
ElVencedor
Member

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

Спасибо :)
29 мар 17, 14:52    [20346794]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
CrazyDr1v3r
Guest
А как же тривиальная группировка по Number?

SELECT Number, MIN(Name), MIN(Proizvod)
FROM Pribor
GROUP BY Number
31 мар 17, 13:48    [20354553]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
CrazyDr1v3r
А как же тривиальная группировка по Number?

SELECT Number, MIN(Name), MIN(Proizvod)
FROM Pribor
GROUP BY Number

никогда так не делайте
31 мар 17, 14:12    [20354675]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
TaPaK
CrazyDr1v3r
А как же тривиальная группировка по Number?

SELECT Number, MIN(Name), MIN(Proizvod)
FROM Pribor
GROUP BY Number

никогда так не делайте
Ну так же тоже нельзя - без объяснений!

CrazyDr1v3r, MIN(Name) и MIN(Proizvod) чаще всего относятся к разным строкам с одним и тем же Number.
31 мар 17, 14:18    [20354713]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
Massa52
Member

Откуда:
Сообщений: 382
А если так

with Pribor as 
(
  select 1050 Number, N'Фильтр грубой очистки' Name, N'Simens' Proizvod
    union all
  select 1050, N'Фильтр грубой очистки', N'Bosh'
    union all
  select 1050, N'Фильтр грубой очистки',  N'Samsung'
    union all
  select 1120, N'Кран запорный', N'BEKO'
    union all
  select 1120, N'Кран запорный', N'AKAI'
    union all
  select 1235, N'Смеситель', N'Samsung'
),
c as
(SELECT Number, Name, MIN(Proizvod) mProizvod
   FROM Pribor
   GROUP BY Number, Name
)
SELECT Number, MIN(Name) mName, mProizvod 
FROM c
GROUP BY Number, mProizvod
ORDER BY Number, mProizvod, mName
31 мар 17, 15:09    [20354945]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Massa52,
а если тебя стукнуть?
31 мар 17, 15:38    [20355066]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
CrazyDr1v3r
Guest
iap
TaPaK
пропущено...

никогда так не делайте
Ну так же тоже нельзя - без объяснений!

CrazyDr1v3r, MIN(Name) и MIN(Proizvod) чаще всего относятся к разным строкам с одним и тем же Number.


И? В данном конкретном случае конкретный номер обозначает конкретную деталь. Какой смысл принадлежности названия детали к конкретной строке? Тем более, никакого пользовательского идентификатора строки нет.
row_number(partition by Number order by Proizvod)) as r
по факту - так же бьет на группы по Number с нумерацией внутри групп
31 мар 17, 15:57    [20355166]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
CrazyDr1v3r,

В теории тебе намекают, что твое решение - быдлокод.
По факту - ты сопротивляешься применять правильное решение.
31 мар 17, 16:32    [20355296]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
CrazyDr1v3r
Guest
Руслан Дамирович,

Ну примените ваше "правильное решение" на SQL Server 2000 ;)
31 мар 17, 17:12    [20355448]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
TaPaK
Member

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

и в чём затруднение? пронумеровать строки?
31 мар 17, 18:14    [20355700]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
Massa52
Member

Откуда:
Сообщений: 382
Руслан Дамирович
Massa52,
а если тебя стукнуть?

Злой стал абзы. Ругаешься много. Нехарошо это.
1 апр 17, 01:43    [20356384]     Ответить | Цитировать Сообщить модератору
 Re: Выборка записей нескольких записей TOP 1 по одному из полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
CrazyDr1v3r
А как же тривиальная группировка по Number?

SELECT Number, MIN(Name), MIN(Proizvod)
FROM Pribor
GROUP BY Number
У вас получился правильный ответ, потому что в данном случае (на этих данных) Number и Name идентифицируют по отдельности некую бизнес-сущность (видимо, ИД и название типа изделия).
И в этом случае семантически правильнее написать:
SELECT Number, Name, MIN(Proizvod)
FROM Pribor
GROUP BY Number, Name


Если же это не так (например, Number - тип изделия, а Name - название папки в справочнике), то ваш код выдаст ошибку, получится, что для данного типа изделия и производителя покажутся папки справочника, в которых нету этих данных.
Тип товараКаталогВендор
1050Фильтр грубой очисткиSimens
1050Фильтр грубой очисткиBosh
1050СантехарматураSamsung
1120Кран запорныйBEKO
1120Краны премиумAKAI
1235СмесительSamsung
1 апр 17, 12:39    [20356783]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить