我正在研究MarkLogic 9 Optic Java API,以构建复杂的查询来执行某些操作并返回结果。下面是我的代码构建的示例查询(使用com.marklogic.client.expression.PlanBuilder和com.marklogic.client.expression.PlanBuilder.ModifyPlan类):
op:from-view(recordsSchema, recordsView).op:join-inner(op:from-view(productsSchema, productsView), op:on(op:view-col(recordsView, md5Digest), op:view-col(productsView, md5Digest))).op:join-inner(op:from-view(occurrencesSchema, occurrencesView), op:on(op:view-col(productsView, md5Digest), op:view-col(occurrencesView, md5Digest)))
.op:where(op:or(op:and(fn:contains(op:col(adDescription), SNACK FOODS), op:eq(op:col(pageNumber), 5)), op:and(op:eq(op:col(state), KY), op:eq(op:col(issue), 2018-01-21))))
.op:select((op:col(pageNumber), op:col(state), op:col(adDescription), op:col(issue)))
.op:order-by(op:desc(op:col(issue)))
现在我想通过一个字段(例如报纸)对这些结果进行分区,以便结果中的行数相同,但它们会根据提供的字段进行隔离,例如:
Newspaper 1:
[row 1]
[row 2]
[row 3]
Newspaper 2:
[row 1]
[row 2]
等等...... 在SQL中,这可以通过使用与PARTITION BY结合的rank()函数来完成。但我无法在Optic API中找到相同的功能来执行此操作。 另一种可能的方法是对该字段使用额外的“order by”(在本例中为报纸);找到不同的价值观(例如,报纸1,报纸2);然后运行一个select结果集中的where查询,并通过将它们保存在变量和某些数据结构(如List)中来使用这些结果子集。但这似乎有点过于复杂。我觉得应该有一个更简单的方法来做到这一点。 ModifyPlan有一个方法groupBy()但它将匹配该字段的所有行折叠成一行 - 而我想保留总行数。 任何有关如何实现这一目标的帮助/意见将受到高度赞赏。 - 斯瓦蒂