MarkLogic Xquery 在 1 分钟内找到所有时间戳

MarkLogic Xquery finding all timestamps within 1 minute of eachother

对于这个相当具体的用例,我们深表歉意。

我有一系列文档,它们都有一个时间戳字段:

2021-12-15T03:06:04Z
2021-12-15T03:06:14Z
2021-12-15T03:06:24Z
2021-12-15T03:06:34Z
2021-12-15T03:06:44Z
2021-12-15T03:07:04Z
2021-12-15T03:17:04Z

我的目标是确定哪些文档彼此之间的时间都在 1 分钟以内,并删除除其中一个以外的所有文档(因此我们每 60 秒间隔只有 1 个文档)。保留哪个文件并不重要。

是否有我可以利用的任何 dateTime 函数或 xfunct 函数来优雅地解决这个问题?数据的一个重要警告是所有时间戳都是随机的,我们可以根据返回的时间戳没有模式。还有大约 1k 个文档需要每 3 小时 运行,因此性能也是一个问题。

预先感谢任何回复的人。

您可以按具有分钟精度格式的日期时间对它们进行分组,将其用作映射的键​​,然后使用这些值执行 put。到最后,每分钟只有一个条目。

let $dates := ("2021-12-15T03:06:04Z",
"2021-12-15T03:06:14Z",
"2021-12-15T03:06:24Z",
"2021-12-15T03:06:34Z",
"2021-12-15T03:06:44Z",
"2021-12-15T03:07:04Z",
"2021-12-15T03:17:04Z")!xs:dateTime(.)

let $dates-by-minute := map:map()
let $_group :=
  for $date in $dates
  let $key := fn:format-dateTime($date, "[Y01]/[M01]/[D01] [H01]:[m01]")
  return map:put($dates-by-minute, $key, $date)

return
  map:keys($dates-by-minute) ! map:get($dates-by-minute, .)