将 fragment & group_by 与 postgres & ecto 一起使用?
Using fragment & group_by together with postgres & ecto?
我正在努力让它与 Postgres 和 Ecto 一起工作。下面的查询在没有 group_by 的情况下工作正常,但我需要在它似乎看不到的片段字段上进行分组。知道它有什么问题吗?
def query_clicks do
from(Click)
|> select(
[c],
[
fragment("date_trunc('hour',?) as hour", c.inserted_at), c.link_id]
)
|> group_by([c], c.hour)
|> Repo.all
end
结果:
iex(1)> recompile; Shortr.LinkContext.query_clicks
[debug] QUERY ERROR source="clicks" db=1.2ms queue=4.9ms
SELECT date_trunc('hour',c0."inserted_at") as hour, c0."link_id" FROM "clicks" AS c0 GROUP BY c0."hour" []
** (Postgrex.Error) ERROR 42703 (undefined_column) column c0.hour does not exist
query: SELECT date_trunc('hour',c0."inserted_at") as hour, c0."link_id" FROM "clicks" AS c0 GROUP BY c0."hour"
(ecto_sql) lib/ecto/adapters/sql.ex:604: Ecto.Adapters.SQL.raise_sql_call_error/1
(ecto_sql) lib/ecto/adapters/sql.ex:537: Ecto.Adapters.SQL.execute/5
(ecto) lib/ecto/repo/queryable.ex:147: Ecto.Repo.Queryable.execute/4
(ecto) lib/ecto/repo/queryable.ex:18: Ecto.Repo.Queryable.all/3
iex(1)>
在生成的 SQL 中调用 c0.hour
而将列别名为 hour
。应该是
SELECT date_trunc('hour',c0."inserted_at") as hour, c0."link_id" FROM "clicks" AS c0 GROUP BY hour
在 Ecto 中,这将变为
def query_clicks do
from(Click)
|> select(
[c],
[
fragment("date_trunc('hour',?) as hour", c.inserted_at), c.link_id
]
)
|> group_by([c], fragment("hour"))
|> Repo.all
end
另一个问题是 link_id
,SELECT 子句中的任何字段都必须出现在 GROUP BY 子句中或者是聚合。例如,您也可以按 link_id
.
分组
我正在努力让它与 Postgres 和 Ecto 一起工作。下面的查询在没有 group_by 的情况下工作正常,但我需要在它似乎看不到的片段字段上进行分组。知道它有什么问题吗?
def query_clicks do
from(Click)
|> select(
[c],
[
fragment("date_trunc('hour',?) as hour", c.inserted_at), c.link_id]
)
|> group_by([c], c.hour)
|> Repo.all
end
结果:
iex(1)> recompile; Shortr.LinkContext.query_clicks
[debug] QUERY ERROR source="clicks" db=1.2ms queue=4.9ms
SELECT date_trunc('hour',c0."inserted_at") as hour, c0."link_id" FROM "clicks" AS c0 GROUP BY c0."hour" []
** (Postgrex.Error) ERROR 42703 (undefined_column) column c0.hour does not exist
query: SELECT date_trunc('hour',c0."inserted_at") as hour, c0."link_id" FROM "clicks" AS c0 GROUP BY c0."hour"
(ecto_sql) lib/ecto/adapters/sql.ex:604: Ecto.Adapters.SQL.raise_sql_call_error/1
(ecto_sql) lib/ecto/adapters/sql.ex:537: Ecto.Adapters.SQL.execute/5
(ecto) lib/ecto/repo/queryable.ex:147: Ecto.Repo.Queryable.execute/4
(ecto) lib/ecto/repo/queryable.ex:18: Ecto.Repo.Queryable.all/3
iex(1)>
在生成的 SQL 中调用 c0.hour
而将列别名为 hour
。应该是
SELECT date_trunc('hour',c0."inserted_at") as hour, c0."link_id" FROM "clicks" AS c0 GROUP BY hour
在 Ecto 中,这将变为
def query_clicks do
from(Click)
|> select(
[c],
[
fragment("date_trunc('hour',?) as hour", c.inserted_at), c.link_id
]
)
|> group_by([c], fragment("hour"))
|> Repo.all
end
另一个问题是 link_id
,SELECT 子句中的任何字段都必须出现在 GROUP BY 子句中或者是聚合。例如,您也可以按 link_id
.