在日期时间字段和 returns 元组列表上执行 group_by MONTH 的 Ecto 查询

Ecto query that does a group_by MONTH on a datetime field and returns list of tuples

作为 的附带问题:

如何将查询更改为 return 包含月份整数和分组计数的元组列表?所以你的结果看起来像:

[{1, 2}, {2, 2}, {3, 2}, {4,2}]

只是从问题的评论中移植这个。

query 
|> group_by([e], fragment("date_part('month', ?)", e.inserted_at)) 
|> select([e], {fragment("date_part('month', ?)", e.inserted_at), count(e.id)}) 
|> Repo.all

找到答案:

query 
|> group_by([e], fragment("date_part('month', ?)", e.inserted_at)) 
|> select([e], {fragment("date_part('month', ?)", e.inserted_at), count(e.id)}) 
|> Repo.all

可能更清楚一点。

query = from u in User,
  group_by: fragment("date_part('month', ?)", u.inserted_at),
  select:   {fragment("date_part('month', ?)", u.inserted_at), count(u.id)}
Repo.all(query)

你也可以这样命名片段。

User
|> group_by(fragment("month"))
|> select([u], {fragment("date_part('month', ?) as month", u.inserted_at), count(u.id)})
|> Repo.all()

我正在使用它,因为我得到的是浮点数 return 值(比如 6.0 而不是 6)

User
|> group_by(fragment("month"))
|> select([u], {fragment("date_part('month', ?)::int as month", u.inserted_at), count(u.id)})
|> Repo.all()