从纪元日期开始按月聚合 - neo4j cypher
Aggregating by Month from epoch date - neo4j cypher
目标
我正在尝试查询 neo4j 的平均分数,按月汇总。
背景
我的数据库中的日期属性设置为纪元时间戳。
到目前为止工作
到目前为止我有以下代码
MATCH(d:data) RETURN avg(d.score), date(datetime({epochMillis:d.submitted})) AS date
问题
这将 return 平均分数,每天(对于存在记录的每一天)
我想获得每个月的平均值,而不是天数。
也试过
我有一个很好的 google 并且似乎找不到不依赖于安装 apoch 插件(我没有)的答案。
我找到了以下内容,但无法理解(就像大多数 neo4j 文档一样)它实际上想说什么。
https://neo4j.com/docs/api/python-driver/current/temporal_types.html
额外
理想情况下,我想报告从“今天”开始的最多 12 个月,并包括月份,即使该月份没有记录(return 月份名称和 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 的平均分数,按月汇总。
背景
我的数据库中的日期属性设置为纪元时间戳。
到目前为止工作
到目前为止我有以下代码
MATCH(d:data) RETURN avg(d.score), date(datetime({epochMillis:d.submitted})) AS date
问题
这将 return 平均分数,每天(对于存在记录的每一天)
我想获得每个月的平均值,而不是天数。
也试过
我有一个很好的 google 并且似乎找不到不依赖于安装 apoch 插件(我没有)的答案。
我找到了以下内容,但无法理解(就像大多数 neo4j 文档一样)它实际上想说什么。 https://neo4j.com/docs/api/python-driver/current/temporal_types.html
额外
理想情况下,我想报告从“今天”开始的最多 12 个月,并包括月份,即使该月份没有记录(return 月份名称和 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