0

イベント 'X' が最大値 (過去 1 か月、過去 7 日間、または 1 日など) に達したときにイベントの 5 分間の時間枠を取得し、それが最大だったときにイベントの時間を取得するにはどうすればよいですか?

4

2 に答える 2

1

私の理解が正しければ、「作成された」要素(またはそれが呼ばれるもの)を含むドキュメントがあります。その要素に dateTime 範囲インデックスがあるとします。

あなたがしようとしているのは、これらの時間を 5 分間隔でバケット化し、最も人口の多いバケットを見つけることです。検索 API と REST API はそれぞれ機能としてバケットを提供します。これは通常、少数のバケットで使用されますが、試してみてください。

それがうまくいかない場合は、必要なバケットを構築するだけで、同様のことをより手動で行うことができます。

(: 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 分間隔を識別する一意のキーを見つけて、それを返します。

于 2016-01-19T12:47:14.647 に答える
0

5 分間のバケットを構築することは、MarkLogic 固有ではありません。以下は、2000 年 1 月 1 日の午前 0 時から始まる 10,000 個の 5 分間のバケットを提供する XQuery です (約 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

開始境界と終了境界の作成は、ユーザーの演習として残します。

于 2016-01-20T20:12:01.863 に答える