Производный столбец, содержащий имена столбцов, отсортированные по дате

Я хочу создать производный столбец, как показано ниже, без использования операторов If-Else.

Производный столбец, содержащий имена столбцов, отсортированные по дате

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
42
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для каждого из столбцов 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

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