如何根据两列对 table in ecto 进行排序

How to sort table in ecto based on two columns

我有 table 和 timeoperation 列。操作列包括 createupdatedelete 值,时间有 elixir utc 日期时间。我想根据日期时间进行排序,如果根据相同的时间戳存在多行,我想先取 delete 行,而不是 createupdate.

错误:

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 相关的值应该最后出现。

如果我们使用以下查询执行此操作,它将始终接受“删除”作为第一个值,但不会对 updatecreate 行进行排序。我很想知道我们是否可以以某种方式扩展此查询中片段的使用,以根据所有 createupdatedelete 字段进行排序。

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

你可以试试这个(如果你使用 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 ORDER BY multiple values in specific order?