Получить наименьшую группу в пределах одной таблицы для данного столбца - PullRequest
0 голосов
/ 10 мая 2018

У меня есть таблица, которая имеет 3 столбца. Plate_Id Prod_Id LOCATION_ID

Таблица выглядит примерно так,

enter image description here

Желаемым результатом должны быть выделенные строки.

По сути, мне нужен plate_id с местоположениями, которые являются самой маленькой группой. Мне плевать на Prod_Id после.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Для некоторых конкретных СУБД вы можете использовать LIMIT или TOP предложение

select * 
from table t
where Prod_Id = (select top(1)  Prod_Id
                 from table
                 where plateid = t.plateid
                 group by Prod_Id
                 order by count(1) ASC
                );

LIMTI предложение

select * 
from table t
where Prod_Id = (select Prod_Id
                  from table
                  where plateid = t.plateid
                  group by Prod_Id
                  order by count(1) ASC
                  LIMIT 1
                 );
0 голосов
/ 10 мая 2018

ВНИМАНИЕ: ЭТО НЕ ДЕЙСТВИТЕЛЬНОЕ РЕШЕНИЕ !!! Просто держите это здесь, чтобы кто-то не совершил ту же ошибку.

Это решение не учитывает более 2 сценариев prod_id.

Спасибо, ребята! Я понял следующее, и это работает для меня. Если вы думаете, что может быть лазейка, которую я мог бы пропустить, тогда, пожалуйста, прокомментируйте.

SELECT DISTINCT pp1.plate_id, pp1.location
FROM MyPlate pp1

inner join MyPlate  pp2 on pp1.plate_id = pp2.plate_id and pp1.location = pp2.location

WHERE pp1.prod_id <> pp2.prod_id

ORDER BY pp1.plate_id

Но вот некоторые интересные решения, которые у вас были, это будет удобно в будущем! Еще раз спасибо!

0 голосов
/ 10 мая 2018

Один метод использует коррелированный подзапрос. Следующее использует синтаксис ANSI SQL:

select t.*
from t
where t.prodId = (select t2.prodId
                  from t t2
                  where t2.plateid = t.placteid
                  group by t2.prodId
                  order by count(*) asc
                  fetch first 1 row only
                 );

Другой способ использует оконные функции:

select t.*
from (select t.*, rank(cnt) over (partition by plateid order by cnt) as seqnum
      from (select t.*,
                   count(*) over (partition by plateid, prodid) as cnt
            from t
           ) t
     ) t
where seqnum = 1;

Эта версия возвращает все "самые маленькие" группы. Если вам нужен только один на plateid, используйте row_number() вместо rank().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...