我正在研究 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 中,这可以通过使用 rank() 函数和 PARTITION BY 来完成。但是我在 Optic API 中找不到等效的函数来执行此操作。另一种可能的方法是为此字段使用额外的“排序依据”(在本例中为报纸);找到不同的值(例如,报纸 1、报纸 2);然后在结果集上运行带有 where 的选择查询,并通过将这些结果子集保存在变量和某些数据结构(如 List)中来使用这些结果子集。但这似乎有点太复杂了。我觉得应该有一个更简单的方法来做到这一点。ModifyPlan 有一个方法 groupBy() 但它将与该字段匹配的所有行折叠成一行 - 而我想保留总行数。任何有关如何实现这一目标的帮助/意见将不胜感激。- 斯瓦蒂语