从SQL到Neo4j:尝试对查询结果进行分组

时间:2017-08-08 11:31:24

标签: sql database oracle neo4j cypher

我在SQL中有以下查询( Oracle DB 11g XE

仅针对上下文:此查询搜索具有最大功率因数的传感器,每个月的范围介于0.90和0.99之间)

with abc as (select extract(month from peak_time) as Month, 
max(total_power_factor) as Max_Power_Factor 
from sensors group by extract(month from peak_time) order by Month DESC) 
select abc.Month, Max_Power_Factor, meter_id as "Made by" 
from abc join sensors 
on sensors.total_power_factor = abc.Max_Power_Factor 
where Max_Power_Factor between 0.90 and 0.99
order by Max_Power_Factor;

SQL Developer向我显示正确的结果,每个月仅一行,没有重复;例如:

Month  Max_Power_Factor Scored by
6      0.981046427565   b492b271760a
1      0.945921825336   db71ffead179
3      0.943302142482   a9c471b03587
8      0.9383185638     410bd58c8396
7      0.930911694091   fe5954a46888
5      0.912872055549   ee3c8ec29155

我的问题是尝试在 Neo4j (3.2.1 CE,在Windows 10上)复制相同的查询:我不知道如何对数据进行分组为了得到相同的结果。 (如您所见,我正在使用 APOC 来管理日期)

match(a:Sensor) with a, a.peak_time as peak_time
where (a.total_power_factor > 0.90 and a.total_power_factor <0.99 )
RETURN distinct a.meterid, max(peak_time),apoc.date.format(peak_time,'s','MM') as month
order by month desc

这些是我的Cypher结果,如您所见,每个月有多行

Month   Max_Power_Factor Scored by
06      0.981046427565  b492b271760a
01      0.945921825336  db71ffead179
03      0.943302142482  a9c471b03587
08      0.9383185638    410bd58c8396
08      0.93451098613   dfd6b67cc6d6
07      0.930911694091  fe5954a46888
02      0.916440282713  649956b34e87
05      0.912872055549  ee3c8ec29155
08      0.907059974935  a3e8df8a0ba8

所以我的问题是:如何对数据进行分组以获得与Oracle DB相同的输出?(如果可能的话,当然)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您显示的输出中的字段与查询不对应(例如,究竟是什么是“Scored By”?)但是在Neo4j中聚合的技巧是理解聚合键是隐式的。

所以,如果你有

RETURN distinct a.meterid, max(peak_time),apoc.date.format(peak_time,'s','MM') as month

您正在分组米和月

如果您只想按月分组,那么

RETURN max(peak_time),apoc.date.format(peak_time,'s','MM') as month

希望这有帮助!

此致 汤姆