首页 > 解决方案 > 当你在 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 相同的效果

标签: elixirecto

解决方案


你在后面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)}

当需要检索costmaxinserted_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_atiso8601自然排序的字符串。剩下的唯一一件事就是用

  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

推荐阅读