neo4j - 从纪元日期开始按月聚合 - neo4j cypher

标签 neo4j cypher average aggregate-functions

目标

我正在尝试查询 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), 'ms', 'YYYY-MM') AS month,
       coalesce(avg(A.score), 0) AS score

关于neo4j - 从纪元日期开始按月聚合 - neo4j cypher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66501660/

相关文章:

neo4j - 查找未设置属性的Neo4j节点

Neo4j Cypher - 在密码查询中按类型排除关系?

python - 从 Django 中的一组对象中获取平均值

mysql - 如何在单个 MySQL 查询中选择多个平均值?

csv - 无法将 CSV 文件加载到 Neo4j

减少信号数据噪声的算法?

Neo4j:与深度关系的条件

database - 图数据库中的面向对象编程

linux - 无法在 ubuntu 中启动 neo4j 服务器

neo4j - 密码: `sort -u` 的模拟来合并 2 个集合?