从epoch日期开始按月份聚合-neo4j密码



目标

我正在尝试查询neo4j的平均分数,按月份汇总

背景

数据库中的日期属性设置为epoch时间戳。

到目前为止的工作

到目前为止,我有以下代码

MATCH(d:data) RETURN avg(d.score), date(datetime({epochMillis:d.submitted})) AS date

问题

这将返回平均分数,每天(记录存在的每一天)

我想得到每个月的平均数,而不是天数。

也尝试过

我有一个很好的谷歌,似乎找不到一个不依赖安装apoch插件的答案(我没有)。

我发现了以下内容,但就是不明白(就像大多数neo4j文档一样)它到底想说什么。https://neo4j.com/docs/api/python-driver/current/temporal_types.html

附加

理想情况下,我想报告从";今天";并且包括月份,即使没有该月份的记录(返回月份名称和0),也不确定这是否如此简单,所以任何想法都很感激!

最简单的方法是按年和月进行聚合:

MATCH (d:data) 
RETURN apoc.date.format(d.submitted, 'ms', 'YYYY-MM') AS month,
avg(d.score) AS score
ORDER BY month DESC
LIMIT 12

或不带apoc.date.format:

MATCH (d:data)
WITH d, datetime({epochMillis:d.submitted}) as dt
RETURN dt.year as year, 
dt.month as month,
avg(d.score) AS score
ORDER BY year DESC, month DESC
LIMIT 12

但如果你想使用最后12个月(或任何其他值)的可能为零,那么最好的方法是创建一个前几个月的列表(使用"持续时间"函数),然后可选地匹配日期范围内的值并计算平均值:

WITH date() AS today
UNWIND [
i IN range(0, 11) | 
datetime.truncate('month', today - duration({months: i}))
] AS firstDayOfMonth
OPTIONAL MATCH (A:data) 
WHERE A.submitted >= timestamp(firstDayOfMonth) AND
A.submitted <  timestamp(firstDayOfMonth + duration({months: 1}))
RETURN apoc.date.format(timestamp(firstDayOfMonth), 'ms', 'YYYY-MM') AS month,
coalesce(avg(A.score), 0) AS score

最新更新