Ecto 片段在 group_by 中插值变量



我正在尝试以下内容:

query =
from s in State,
group_by:
fragment("date_part(?, ?)", ^group, s.timestamp_start),
select:
{fragment("date_part(?, ?)", ^group, s.timestamp_start), count(s.id)}
Repo.all(query)

其中group可能是['minute''hour''day']之一。

但是,我收到以下错误:

错误 42803 (grouping_error( 列"s0.timestamp_start"必须出现在 GROUP BY 子句中或在聚合函数中使用

但是,如果我group_by子句中添加s.timestamp_start,则不会得到预期的结果,因为日期是按timestamp_start而不是按定义的部分分组的。

如何做到这一点而不必为每个group可能性指定查询(在fragment内传递文本值(?

在这里找到了答案。

您可以使用片段中的as相互引用:

from(m in Message,,
group_by: fragment("timestamp"),
select: fragment("date_trunc(?, ?) as timestamp", ^timeseries, m.inserted_at)
)

当您执行分组依据时,您选择的所有内容都必须与分组依据相关,或者使用其中一个聚合函数。 由于您按年、月等分组,数据库不知道在该行中显示哪个timestamp_start。 如果要显示该特定行的所有时间戳,可以使用一个片段来构建最终会string_agg(s.timestamp_start, ',')

的内容

相关内容

  • 没有找到相关文章

最新更新