Это легко сделать, создав таблицу из трех столбцов и используя для этого статистическую функцию:
В Postgres работают следующие работы:
select c0,c1,c2,
(select c
from unnest(array[c0,c1,c2]) as t(c)
group by c
having count(*) > 1
order by count(*) desc
limit 1)
from the_table;
Если вы не хотите жестко кодировать имена столбцов, вы также можете использовать JSON-функцию Postgres:
select t.*,
(select t.v
from jsonb_each_text(to_jsonb(t)) as t(c,v)
group by t.v
having count(*) > 1
order by count(*) desc
limit 1) as result
from the_table t;
Обратите внимание, что приведенное выше учитывает все столбцы. Если вы хотите удалить определенные столбцы (например, столбец id
), вам нужно использовать to_jsonb(t) - 'id'
, чтобы удалить этот ключ из значения JSON.
Ни одно из этих решений не имеет дело со связями (два разных значения появляются одинаковое количество раз).
Онлайн пример: https://rextester.com/PJR58760
Первое решение можно несколько адаптировать к Oracle, особенно если вы можете создать SQL на лету:
select t.*,
(select c
from (
-- this part would need to be done dynamically
-- if you don't know the columns
select t.c0 as c from dual union all
select t.c1 from dual union all
select t.c2 from dual
) x
group by c
having count(*) > 1
order by count(*) desc
fetch first 1 rows only) as result
from the_table t;