Я хочу создать производный столбец, как показано ниже, без использования операторов If-Else.
У меня есть столбцы x,y,z, в которых все даты. Я хочу получить четвертый столбец, который показывает порядок полей в ascending без использования If-Else or Case when. Является ли это возможным?






Для каждого из столбцов x, y, z выберите соответствующий символьный литерал, псевдоним столбца для общего имени и другие столбцы, как они есть. Объедините результаты. Теперь выберите другие столбцы из объединения и используйте group_concat() с выражением ORDER BY, чтобы получить отсортированный список.
SELECT x.s_n,
x.x,
x.y,
x.z,
group_concat(x.c
ORDER BY x.d) derived_column
FROM (SELECT t.s_n,
t.x,
t.y,
t.z,
'x' c,
t.x d
FROM elbat t
UNION ALL
SELECT t.s_n,
t.x,
t.y,
t.z,
'y' c,
t.y d
FROM elbat t
UNION ALL
SELECT t.s_n,
t.x,
t.y,
t.z,
'z' c,
t.z d
FROM elbat t) x
GROUP BY x.s_n,
x.x,
x.y,
x.z;
В ваших данных образца я думаю, что результат 3-й строки - это 'z,y,x', верно?
select xyz.*, t.derived_column from (
select s_n, group_concat(type order by value) as derived_column from
(
select s_n, 'x' as type, x as value from xyz
union all
select s_n, 'y' as type, y as value from xyz
union all
select s_n, 'z' as type, z as value from xyz
) as xyz1
group by s_n
) as t
inner join xyz
on t.s_n = xyz.s_n
См. демонстрация
Сделать это без агрегирования довольно сложно. Но это возможно. Конечно, настоящая проблема - получить средний элемент - особенно без case или if (). Однако это всего лишь вызов.
select concat_ws(',',
highest,
coalesce(elt(field('x', highest, least) + 1, 'x'), elt(field('y', highest, least) + 1, 'y'), elt(field('z', highest, least) + 1, 'z')),
lowest
)
from (select x.*,
elt(field(greatest(x, y, z), x, y, z), 'x', 'y', 'z') as highest,
elt(field(least(x, y, z), x, y, z), 'x', 'y', 'z') as least
from (select 'a' as a, 1 as x, 2 as y, 3 as z union all
select 'b' as a, 4 as x, 2 as y, 3 as z
) t
) t;
Фактически вы можете выразить выражение среднего значения без подзапроса, но это намного сложнее. Вышеупомянутое использует целые числа, но логика работает так же хорошо с датами или строками.
Это также можно записать как:
select elt(field(concat(highest, lowest), 'xy', 'xz', 'yz', 'yx', 'zx', 'zy'), 'x,z,y', 'x,y,z', 'y,x,z', 'y,z,x', 'z,y,x', 'z,x,y')
from (select t.*,
elt(field(greatest(x, y, z), x, y, z), 'x', 'y', 'z') as highest,
elt(field(least(x, y, z), x, y, z), 'x', 'y', 'z') as lowest
from (select 'a' as a, 1 as x, 2 as y, 3 as z union all
select 'b' as a, 4 as x, 2 as y, 3 as z
) t
) t