微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从纪元日期开始按月聚合 - neo4j cypher 目标背景目前工作问题也试过了

如何解决从纪元日期开始按月聚合 - neo4j cypher 目标背景目前工作问题也试过了

目标

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

背景

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

目前工作

到目前为止我有以下代码

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

附加

理想情况下,我想从“今天”报告最多 12 个月,即使该月没有记录也包括月份(返回月份名称和 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),coalesce(avg(A.score),0) AS score

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。