我正在尝试以下内容:
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, ',')