Я работаю над 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 для этого.
Другим возможным способом сделать это может быть использование дополнительного 'order by' для этого поля (газета, в данном примере); найти различные значения (например, газета 1, газета 2); затем запустите запрос на выборку с набором результатов where и используйте эти подмножества результатов, удерживая их в переменной и в некоторой структуре данных, такой как List. Но это кажется слишком сложным. Я чувствую, что должен быть более простой способ сделать это.
У ModifyPlan есть метод groupBy (), но он объединяет все строки, соответствующие полю, в одну строку, в то время как я хочу сохранить общее количество строк.
Любая помощь / мнение о том, как этого добиться, будет высоко оценена.
- Свати