当事件达到最大值时,获得5分钟的窗口。值

时间:2016-01-18 17:10:15

标签: marklogic marklogic-8

如果事件'X'达到其最大值(例如在过去一个月或过去7天或一天中),我如何获得事件'X'的5分钟时间窗口并获取事件的时间也是当它最大时..

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你就会有一个带有“已创建”元素的文档(或其他任何名称)。假设您在该元素上有一个dateTime范围索引。

您要做的是以5分钟为间隔进行这些时间,然后找到人口最多的存储桶。搜索和REST API均提供bucketing作为功能。这通常用于较少数量的桶,但尝试一下。

如果效果不好,您可以手动执行类似操作,只需构建所需的存储桶即可。

(: untested :)
let $buckets := map:map()
let $populate :=
  for $dt in cts:values(cts:element-reference(xs:QName("created")), (), (), $query)
  let $bucket := local:bucket($dt)
  return 
    map:put(
      $buckets, 
      $bucket, 
      (map:get($buckets, $bucket), 0)[1] + cts:frequency($dt)
let $inverse := -$buckets
let $max-count := fn:max(map:keys($inverse))
let $max-bucket := map:get($inverse, $max-count)

$max-bucket将是具有最大数值的桶的序列(如果存在并列,则不止一个)。您将使用$query缩小到目标月份(或其他时间范围)。您需要实施local:bucket() -

declare function local:bucket($dt as xs:dateTime)

找出一些识别5分钟间隔并返回的唯一键。

答案 1 :(得分:0)

构建5分钟持续时间的存储桶不是MarkLogic特有的。这是一些XQuery,从2000年1月1日午夜开始,你可以获得10,000个5分钟的桶。(大约35天):

let $ranges as xs:dateTime+ := 
  for $d in (0 to 10000) 
  return xs:dateTime("2000-01-01T00:00:00") + (xs:dayTimeDuration("PT300S") * $d)
return $ranges

我将创建开始和结束边界作为用户的练习。