Мне нужно выполнить настраиваемую сортировку Oracle

Простите, если это простой вопрос. Тем не менее, я искал ответ повсюду в течение часа.

У меня есть db_table, с которой мне нужно отсортировать вывод в таблицу на веб-странице. Данные хранятся в db_table следующим образом:

   date          Area         Value
   ------        ------      -------
 11-mar-18        middle        10
 11-mar-18        bottom         5
 11-mar-18        top           12

 12-mar-18        top           14
 12-mar-18        bottom         4
 12-mar-18        middle        17

Возникает вопрос: как их отсортировать, чтобы получить следующий результат:

    date          Area         Value
   ------        ------      -------
 11-mar-18        top           12 
 11-mar-18        middle        10
 11-mar-18        bottom         5 

 12-mar-18        top           14
 12-mar-18        middle        17
 12-mar-18        bottom         4

Любая помощь приветствуется.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
0
2 409
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сортировка области по убыванию в алфавитном порядке как второй компонент Сортировать по:

select *
  from db_table
 order by "date", area desc;

Как вы упомянули, если у области есть значения A, B, C, D, и они хотели, чтобы они были отсортированы в порядке C, B, D, A, используйте:

select *
  from db_table
 order by "date", decode(area,'C',1,'B',2,'D',3,'A',4);

P.S. в частности, я помещаю столбец даты в кавычки, поскольку уже создана таблица со столбцом "date", вместо date, что невозможно как ключевое слово.

Извините, я забыл упомянуть один аспект. Что, если бы варианты в столбце области были, например, A, B, C, D, и я хотел бы отсортировать по дате, а затем отсортировать области как C, B, D, A?

jjones150 13.04.2018 00:10

упорядочить по "дате", декодировать (область, 'C', 1, 'B', 2, 'D', 3, 'A', 4)

Barbaros Özhan 13.04.2018 00:13

Лучше всего использовать decode (или case) во всех ситуациях, и не использовать случайность, когда TOP, MIDDLE и BOTTOM оказываются в обратном лексикографическом порядке. Однажды они изменятся на ПЕРВЫЙ, СРЕДНИЙ, ПОСЛЕДНИЙ, и запрос больше не будет давать правильный порядок. Лучше всего заставить их внести необходимые изменения в ORDER BY, если они когда-нибудь сделают что-то подобное.

mathguy 13.04.2018 00:35
Ответ принят как подходящий
select *
  from db_table
 order by "date", 
    case 
       when area = 'top' then 1 
       when area = 'middle' then 2
       when area = 'bottom' then 3
       else 4
    end;

Обратитесь к Пользовательский порядок сортировки

«Простое» выражение регистра работает еще лучше: case area when 'top' then 1 when 'middle' then 2 when 'bottom' then 3 end Также обратите внимание, что если вы не укажете else 4, по умолчанию будет else null - с тем же эффектом при упорядочивании. Вам действительно не нужна деталь else.

mathguy 13.04.2018 00:37

@mathguy, без else 4, области с нулевым значением или значениями, отличными от верхнего, среднего или нижнего, будут отображаться первыми. Может быть, это нормально. else 4 помещает их в конец каждой группы. OP должен принять это решение.

kc2018 13.04.2018 01:04

Нет. Без else 4 выражение case будет возвращать null для строк, отличных от верхней, средней или нижней, и null появляется последним (по умолчанию - если не запрашивается явным образом, чтобы появиться первым) в order by. Вы, кажется, не знакомы с этим, так что это поможет вам написать очень небольшой пример для себя и запустить его. Вы поймете, что я имею в виду.

mathguy 13.04.2018 01:16

@mathguy, ты прав. Я тестировал mysql, а не oracle.

kc2018 13.04.2018 01:23

Чем отличается MySQL? Значение по умолчанию «else null» для case и значение по умолчанию «nulls last» для упорядочивания находятся в стандарте SQL.

mathguy 13.04.2018 14:19

instr() обеспечивает более короткое решение, чем case, в большинстве случаев:

select t.*
from t
order by t.date, instr('top,middle,bottom', area)

Ух ... Что, если значениями, которые нужно отсортировать в этом порядке, будут stop, top и op? Ни один серьезный программист никогда не должен прибегать к подобным уловкам. Используйте decode, если вы находите case слишком многословным.

mathguy 13.04.2018 00:30

@mathguy. . . Значения фиксированы. В большинстве случаев это вполне разумное решение.

Gordon Linoff 13.04.2018 01:11

@GordonLinoff, спасибо, это помогает мне при сортировке размеров, я использовал INSTR ('XS, S, M, L, XL, XXL', size_cd, 1), и он работает. Этот трюк мне очень пригодился.

eifla001 13.04.2018 03:43

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