SQL - несколько дубликатов в некоторых столбцах, 1 столбец должен быть уникальным - PullRequest
0 голосов
/ 25 сентября 2018

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

Мне нужно написать запрос, который выводит строку, если 3 столбца совпадают, но 1 столбец отличается.

Объединенные столбцы 2, 3 и 4 должны иметь дубликат в другой строке,

, но

В столбцах 1, 2, 3 и 4 не должно быть дубликатов в каких-либо других строках.

Пример базы данных:

ROW 1 : 12345 | Test1 | Something1 | And1  (I don't want this, it's a full row duplicate with row 2)

ROW 2 : 12345 | Test1 | Something1 | And1  (I don't want this, it's a full row duplicate with row 1)

ROW 3 : 12344 | Test1 | Something1 | And3  (I don't want this, it's not a full row duplicate but col 2, 3 and 4 combined doesn't exist anywhere else in the table)

ROW 4 : 12222 | Test2 | Something1 | And2  (I want this! It's not a full row duplicate and columns 2, 3 and 4 combined exists in row 9) 

ROW 5 : 12222 | Test3 | Something1 | And3

ROW 6 : 12222 | Test3 | Something1 | And3

ROW 7 : 12224 | Test3 | Something1 | And3

ROW 8 : 12222 | Test3 | Something2 | And3

ROW 9 : 12000 | Test2 | Something1 | And2

Вывод, который я хотел бы получить для этого:

12222 | Test2 | Something1 | And2

12224 | Test3 | Something1 | And3

12000 | Test2 | Something1 | And2

Я надеюсь, что это имеет смысл для кого-то.Заранее благодарю за любую помощь.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Мы можем присоединиться к подзапросу, который идентифицирует повторяющиеся группы, и ограничить его использование:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT col2, col3, col4
    FROM yourTable
    GROUP BY col2, col3, col4
    HAVING COUNT(*) = COUNT(DISTINCT col1) AND COUNT(*) > 1
) t2
    ON t1.col2 = t2.col2 AND t1.col3 = t2.col3 AND t1.col4 = t2.col4;

Демо

0 голосов
/ 25 сентября 2018

Попробуйте:

select 
col1,
col2,
col3,
col4
from (
SELECT 
*,
LEAD(valid, 1, 1) OVER (PARTITION BY col2, col3, col4 ORDER BY col1) as valid_next,
LEAD(invalid, 1, 1) OVER (PARTITION BY col2, col3, col4 ORDER BY col1) as invalid_next
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY col2, col3, col4 ORDER BY col1) AS valid,
ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY col1) AS invalid
FROM tb1
) x ) y
where valid <> valid_next and invalid = invalid_next
ORDER BY col1;

Логика заключается в том, чтобы создать два столбца (valid и invalid) для подсчета появления 1) 3 дублированных столбцов и 2) 4 дублированных столбцов.Затем используйте lag для отслеживания изменений.Если есть изменение, то мы знаем, что есть дубликаты, иначе строка будет уникальной для столбцов, разбитых на разделы.

Таблица вывода:

+--------+--------+-------------+------+
| col1   | col2   |    col3     | col4 |
+--------+--------+-------------+------+
| 12000  | Test2  | Something1  | And2 |
| 12222  | Test2  | Something1  | And2 |
| 12224  | Test3  | Something1  | And3 |
+--------+--------+-------------+------+
0 голосов
/ 25 сентября 2018

Я думаю, что вы хотите not exists:

select t.*
from t
where exists (select 1
              from t t2
              where t2.col2 = t.col2 and t2.col3 = t.col3 and t2.col4 = t.col4 and
                    t2.col1 <> t.col1
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...