#sql #строки
Есть таблица с такой структурой COL1 | COL2 | COL3 -----+------+----- a | d | t -----+------+----- d | t | a -----+------+----- a | t | d -----+------+----- m | n | l -----+------+----- l | m | n Записи, которые могут быть получены из других записей перестановкой значений в столбцах, должны выводиться только один раз. В данном случае ответ будет такой: COL1 | COL2 | COL3 -----+------+----- a | d | t -----+------+----- l | m | n Необходимо решить задачу при помощи стандартного SQL Подскажите пож-та с чего начать и как организовать алгоритм
Ответы
Ответ 1
Вот такой изврат у меня получился для MS SQL: select distinct max, middle, min from ( select (select MAX(v) from (values (col1), (col2), (col3)) as value(v)) as max ,( select * from ( select (case when col1 not in((select MAX(v) from (values (col1), (col2), (col3)) as value(v)),(select MIN(v) from (values (col1), (col2), (col3)) as value(v))) then col1 end) as m union select (case when col2 not in((select MAX(v) from (values (col1), (col2), (col3)) as value(v)),(select MIN(v) from (values (col1), (col2), (col3)) as value(v))) then col2 end) as m union select (case when col3 not in((select MAX(v) from (values (col1), (col2), (col3)) as value(v)),(select MIN(v) from (values (col1), (col2), (col3)) as value(v))) then col3 end) as m ) t where m is not null ) as middle ,(select MIN(v) from (values (col1), (col2), (col3)) as value(v)) as min from #t ) temp Где #t исходная таблица.Ответ 2
Вот что у меня получилось - не совсем верно SELECT DISTINCT max, midl, small FROM ( SELECT least(COL1, COL2, CoL3) as max,replace(replace(CONCAT(COL1, COL2, CoL3),greatest(COL1, COL2, CoL3),''),least(COL1, COL2, CoL3),'') as midl, greatest(COL1, COL2, CoL3) as small FROM test) as t1 Если есть уникальная колонка (id) Вот запрос SELECT COL1, COL2, COl3 FROM ( SELECT id, least( COL1, COL2, CoL3 ) AS max, replace( replace( CONCAT( COL1, COL2, CoL3 ) , greatest( COL1, COL2, CoL3 ) , '' ) , least( COL1, COL2, CoL3 ) , '' ) AS midl, greatest( COL1, COL2, CoL3 ) AS small FROM test ) AS t1, test WHERE test.id = t1.id GROUP BY max, midl, small А вот, если колонок больше нет - правильный запрос SELECT test.COL1, test.COL2, test.COL3 FROM ( SELECT COL1, least( COL1, COL2, CoL3 ) AS max, replace( replace( CONCAT( COL1, COL2, CoL3 ) , greatest( COL1, COL2, CoL3 ) , '' ) , least( COL1, COL2, CoL3 ) , '' ) AS midl, greatest( COL1, COL2, CoL3 ) AS small FROM test ) AS t1, test WHERE test.COL1 = t1.COL1 GROUP BY max, midl, smallОтвет 3
Алгоритм такой: Упорядочить значения в столбцах CASEами. Использовать DISTINCT.Ответ 4
Решение задачи оказалось намного проще. Может-быть кому-нибудь еще поможет) select distinct least(col1,col2,col3) as col1 ,greatest(col1,col2,col3) as col2 ,case when col1 not in (least(col1,col2,col3) ,greatest(col1,col2,col3)) then col1 when col2 not in (least(col1,col2,col3) ,greatest(col1,col2,col3)) then col2 else col3 end col3 from table1;
Комментариев нет:
Отправить комментарий