Как отсортировать таблицу в экто по двум столбцам - PullRequest
2 голосов
/ 03 августа 2020

У меня есть таблица со столбцами time и operation. Столбец операции включает значения create, update и delete, а время имеет elixir ut c datetime. Я хочу отсортировать по дате и времени, и если несколько строк представлены на основе одной и той же метки времени, я хочу сначала взять delete строк, а затем create и затем update.

Неправильно:

1. { time: TIME1, operation: "create" }
2. { time: TIME1, operation: "delete" }
3. { time: TIME1, operation: "update" }

Правильно

1. { time: TIME1, operation: "delete" }
2. { time: TIME1, operation: "create" }
2. { time: TIME1, operation: "update" }

Таким образом, он всегда будет отдавать приоритет delete, а чем create будет выбран, и значения, связанные с update, должны появиться наконец.

Если мы сделаем это ecto, используя следующий запрос, где он всегда будет принимать «удалить» в качестве первого значения, но не будет сортировать update и create строки. Мне любопытно узнать, можем ли мы как-то расширить использование фрагментов в этом запросе, чтобы сортировка была основана на всех полях create, update и delete.

     |> order_by([e],
       asc: e.time,
       desc: e.operation == "delete"
      )

1 Ответ

2 голосов
/ 03 августа 2020

Вы можете попробовать это (если вы используете postgres):

|> order_by([e],
  asc: e.time,
  asc: fragment("CASE ? WHEN 'delete' THEN 1 WHEN 'create' THEN 2 WHEN 'update' THEN 3 END", e.operation)
)

Подробная информация о таком заказе здесь: sql ЗАКАЗАТЬ несколько значений в указанном c порядке?

...