Час пытался решить ее с Клодом, 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.
@TimBiegeleisen Я не могу написать запрос, который будет возвращать идентификаторы 51353 и 51350 из моей таблицы.
«Я хочу получить 51353 и 51350» можно добиться, выполнив SELECT 51353, 51350;
или select 51353 union select 51350;
. Пожалуйста, прочитайте Как спрашивать «Заголовок — это первое, что увидят потенциальные ответчики. Если ваш заголовок не интересен, они не будут читать остальное. Кроме того, без хорошего заголовка люди могут даже не чтобы найти свой вопрос».
@Luuk Мне нужно найти эти значения через столбцы user_id_, а не через id.
@Vit, если я хорошо понимаю твою проблему. Вы хотите получить идентификатор, который имеет уникальную комбинацию user_id1 и user_id_2?
@francoisLENNE Да, это так!
окей, небольшой совет, обнови свой пост с этим объяснением!
@Vit, я работаю над твоей проблемой, с моей точки зрения, все идентификаторы имеют уникальную комбинацию user_id_1 и user_id_2 на основе вставки, которую ты даешь.
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))
Это будет:
R=1
)user_id_1
не находится в другой строке и user_id_2
не находится в другой строке.см.: DBFIDDLE
выход:
Я вижу примеры данных, но не вижу фактической постановки задачи.