elixir - 当你在 ecto 中进行 group_by 时如何选择?
问题描述
我有一个表活动,其字段如下
user_id
role_id
cost
inserted_at
updated_at
deleted_at
所以使用ecto查询我写了一个这样的查询
from t in activity, where: t.id == ^id, group_by: [t.user_id, t.role_id], select: %{inserted_at: t.inserted_at}
因为我不能在不使用聚合函数的情况下使用 select。所以我需要的是我需要选择为insert_at 字段插入的最后一个元素,并且不能在此使用聚合。我有哪些选择?
我怎样才能做到这一点?
group_by 还有其他选择吗,我可以达到与 group_by 相同的效果
解决方案
你在后面max/1
是因为最后一个日期最长。
from t in activity,
where: t.id == ^id,
group_by: [t.user_id, t.role_id],
select: %{inserted_at: max(t.inserted_at)}
当需要检索cost
maxinserted_at
时,以下技巧可能会有所帮助
query =
from t in Activity,
where: t.id == ^id,
group_by: [t.user_id, t.role_id],
select: %{
inserted_at_with_cost:
max(fragment("concat(?, ?)", t.inserted_at, t.cost))
}
concat
将转换inserted_at
为iso8601
自然排序的字符串。剩下的唯一一件事就是用
for %{inserted_at_with_cost: value} <- Repo.all() do
# 2021-10-15 14:59:46.772031
<<inserted_at::binary-size(26), cost::binary>> = value
%{inserted_at: inserted_at, cost: cost}
end