Postgres SQL получает уникальную комбинацию данных из двух столбцов

Час пытался решить ее с Клодом, 4o, Perplexity, но не смог. Затем нашел аналогичный пример SQL отличается по 2 столбцам , с 3 вариантами решения - первый вариант дал ошибку "rn", столбец не найден, второй вариант ( https://stackoverflow.com/a/45950364/7284577 ) дал мне 6 из 7 рядов, и последний я не смог запустить.

Поэтому спрошу здесь. Есть таблица time_user

id;user_id_1;user_id_2
51353;21014;21013
51352;21012;21013
51351;21011;21013
51350;21010;21011
51349;21015;21010
51348;21014;21010
51347;21013;21010

INSERT INTO "time_user" ("id", "user_id_1", "user_id_2") VALUES (51353, 21014, 21013);
INSERT INTO "time_user" ("id", "user_id_1", "user_id_2") VALUES (51352, 21012, 21013);
INSERT INTO "time_user" ("id", "user_id_1", "user_id_2") VALUES (51351, 21011, 21013);
INSERT INTO "time_user" ("id", "user_id_1", "user_id_2") VALUES (51350, 21010, 21011);
INSERT INTO "time_user" ("id", "user_id_1", "user_id_2") VALUES (51349, 21015, 21010);
INSERT INTO "time_user" ("id", "user_id_1", "user_id_2") VALUES (51348, 21014, 21010);
INSERT INTO "time_user" ("id", "user_id_1", "user_id_2") VALUES (51347, 21013, 21010);

Если мы отсортируем по столбцу desc 'id' и начнем собирать строки с разными user_id_ в обоих столбцах (user_id_1, user_id_2), то нам следует взять 51353 (с 21014 и 21013), тогда мы игнорируем 51352 и 51351, потому что они имеют user_id_2==21013, который уже был в ID 51353, тогда мы берем идентификатор 51350, потому что у него есть user_ids 21010 и 21011. 51349-51347 следует игнорировать, потому что user_ids из этих строк находятся в 51353 и 51350.

Ближайшее решение было дано bt Perplexity и вернуло только 51353:

WITH UniqueUsers AS (
    SELECT 
        id,
        user_id_1,
        user_id_2,
        ROW_NUMBER() OVER (ORDER BY id DESC) AS rn
    FROM time_user
),
Filtered AS (
    SELECT 
        u.id,
        u.user_id_1,
        u.user_id_2,
        (SELECT COUNT(*) 
         FROM UniqueUsers f 
         WHERE f.rn < u.rn 
         AND (f.user_id_1 IN (u.user_id_1, u.user_id_2) 
              OR f.user_id_2 IN (u.user_id_1, u.user_id_2))) AS duplicate_count
    FROM UniqueUsers u
)
SELECT id
FROM Filtered
WHERE duplicate_count = 0 ORDER BY id DESC;

Я хочу получить 51353 и 51350

Или, другими словами: хотите получить идентификаторы, в которых они имеют уникальную комбинацию user_id1 и user_id_2.

🤔 А знаете ли вы, что...
SQL имеет стандарт ANSI SQL, который определяет базовый синтаксис для всех реляционных баз данных.


50
1

Ответ:

Решено
SELECT id, user_id_1,user_id_2 FROM (
     SELECT id, user_id_1,user_id_2, row_number() over (order by id desc) as R
     FROM "time_user" 
) t3
WHERE R=1 
  or ( user_id_1 not in (select user_id_1 from "time_user" t2 where t2.id <> t3.id)
       and user_id_2 not in (select user_id_2 from "time_user" t2 where t2.id <> t3.id))

Это будет:

  1. Выберите первую строку (R=1)
  2. Выберите все строки, где user_id_1 не находится в другой строке и user_id_2 не находится в другой строке.

см.: DBFIDDLE

выход:

идентификатор user_id_1 user_id_2 51353 21014 21013 51350 21010 21011