SQL: отфильтровать строки, в которых значение столбца встречается более одного раза - PullRequest
0 голосов
/ 06 января 2019

У меня есть таблица MySQL, которая выглядит следующим образом:

id    |    label
----------------
1          "john"
1          "henry"
1          "sara"
2          "henry"
3          "tim"

Таким образом, данный id может иметь несколько label с. Я хочу сохранить только те строки, в которых id имеет один label. Таким образом, правильный вывод для приведенной выше таблицы будет:

id    |    label
----------------
2          "henry"
3          "tim"

Я думал, что я должен сгруппировать по id и найти количество меток для каждого id. Тогда я бы взял только строки со счетом 1.

WITH temp as
(SELECT id
FROM original_table
GROUP BY id
HAVING COUNT(id) > 5)

SELECT *
FROM original_table ot
WHERE ot.id in temp.id

Это выглядит близко?

Спасибо!

Ответы [ 5 ]

0 голосов
/ 07 января 2019

Я думаю, что агрегация - самый простой метод:

select id, min(label) as label
from original_table t
group by id
having count(*) = 1;
0 голосов
/ 06 января 2019

Да, ваш подход верен, и вам, возможно, придется изменить условие подсчета, и, обращаясь к CTE, вам, возможно, придется немного изменить свой синтаксис, но вы можете сделать это и без CTE в той же строке, что и условие существующие.

Create table  temp  (ID int , Label varchar(10)); 

insert into  temp values 
(1  ,      "john" ), 
(1   ,     "henry" ) , 
(1   ,     "sara" )  , 
( 2   ,    "henry"  ) , 
(3   ,     "tim" ) ; 


select t.ID , t.Label from temp t 
where exists (
select ID, count(1) Dups  from temp t1 where t1.ID = t.ID group by ID having count(1) 
= 1) 

Выход:

    ID, Label
    2, henry
    3, tim
0 голосов
/ 06 января 2019

Вы можете попробовать это:

SELECT t.id, t.label
FROM tbl AS t
JOIN (SELECT id FROM tbl GROUP BY id HAVING count(label) = 1) AS t1
ON t.id = t1.id;
0 голосов
/ 06 января 2019

Предполагая, что пара id и label уникальна, вы можете использовать NOT EXISTS и коррелированный подзапрос.

SELECT t1.id,
       t1.label
       FROM original_table t1
       WHERE NOT EXISTS (SELECT *
                                FROM original_table t2
                                WHERE t2.id = t1.id
                                      AND t2.label <> t1.label);
0 голосов
/ 06 января 2019

Вы можете просто использовать объединение для включения идентификаторов, которые встречаются один раз в подзапросе:

SELECT  id,
        label
  FROM  original_table ot
    INNER JOIN  (
                SELECT  id
                  FROM  original_table
                  GROUP BY id
                  HAVING COUNT(*) = 1
                ) a ON a.id = ot.id;

Или вы можете использовать предложение IN:

SELECT  id,
        label
  FROM  original_table
  WHERE id IN (SELECT   id
                  FROM  original_table
                  GROUP BY id
                  HAVING COUNT(*) = 1
              );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...