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.

Я вижу примеры данных, но не вижу фактической постановки задачи.

Tim Biegeleisen 30.07.2024 16:24

@TimBiegeleisen Я не могу написать запрос, который будет возвращать идентификаторы 51353 и 51350 из моей таблицы.

Vit 30.07.2024 16:30

«Я хочу получить 51353 и 51350» можно добиться, выполнив SELECT 51353, 51350; или select 51353 union select 51350;. Пожалуйста, прочитайте Как спрашивать «Заголовок — это первое, что увидят потенциальные ответчики. Если ваш заголовок не интересен, они не будут читать остальное. Кроме того, без хорошего заголовка люди могут даже не чтобы найти свой вопрос».

Luuk 30.07.2024 16:49

@Luuk Мне нужно найти эти значения через столбцы user_id_, а не через id.

Vit 30.07.2024 16:55

@Vit, если я хорошо понимаю твою проблему. Вы хотите получить идентификатор, который имеет уникальную комбинацию user_id1 и user_id_2?

francois LENNE 30.07.2024 17:02

@francoisLENNE Да, это так!

Vit 30.07.2024 17:07

окей, небольшой совет, обнови свой пост с этим объяснением!

francois LENNE 30.07.2024 17:12

@Vit, я работаю над твоей проблемой, с моей точки зрения, все идентификаторы имеют уникальную комбинацию user_id_1 и user_id_2 на основе вставки, которую ты даешь.

francois LENNE 30.07.2024 17:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
8
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Другие вопросы по теме