neo4j-返回第一行,不进行分组

时间:2018-10-15 19:16:18

标签: neo4j group-by row limit

我正在尝试对neo4j执行以下操作。 我们的节点具有一组属性。日期是这些属性之一。

我希望返回这些属性,但只能使用最新的日期进行查找。

在SQL中,我的查询将如下所示:

select commonKey, attr1, attr2, dateAttr
from ( 
   select commonKey, attr1, attr2, dateAttr, 
   row_number(
         partition by commonKey 
         order by commonKey ASC, dateAttr DESC
     ) rn
from tab 
) t
WHERE t.rn = 1

有没有办法在Cypher中实现相同的目标? 有一个collect(dateAttr)[1],但是它将按我需要返回的所有属性(commonKey,attr1,attr2)分组,而我只关心通过commonKey进行“分组”,但是从第一行返回其他属性在小组中。

任何帮助/建议将不胜感激!

谢谢!

-亚历克斯

1 个答案:

答案 0 :(得分:1)

我认为您要过早地投影属性。按日期对节点进行排序可能会更好,然后按日期对collect()进行分组并采用第一个节点:

MATCH (n:MyNode) 
WHERE ...
WITH n, n.dateAttr as dateAttr
ORDER BY dateAttr DESC 
WITH dateAttr, collect(n)[0] as n
RETURN n.commonKey, n.attr1, n.attr2, dateAttr as TDate

或者,您可以使用APOC程序,对于这种情况,该程序具有aggregation functions

MATCH (n:MyNode) 
WHERE ...
WITH n, n.dateAttr as dateAttr
ORDER BY dateAttr DESC 
WITH dateAttr, apoc.agg.first(n) as n
RETURN n.commonKey, n.attr1, n.attr2, dateAttr as TDate