【问题标题】:How to find the no. of employees department wise?如何找到号码。员工部门明智吗?
【发布时间】:2017-05-13 05:41:31
【问题描述】:

假设我有 n 个文档,其文档结构如下所示 -

<employee>  <name/>     <dob/>  .....   <dept>dept1</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept11</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept12</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dep13</dept> </employee>  
<employee>  <name/>     <dob/>  .....   <dept>dep1n</dept> </employee>  

<employee>  <name/>     <dob/>  .....   <dept>dept2</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept21</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept22</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept23</dept> </employee>  
<employee>  <name/>     <dob/>  .....   <dept>dept2n</dept> </employee>  

<employee>  <name/>     <dob/>  .....   <dept>deptn</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>deptn1</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>deptn2</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>deptn3</dept> </employee>  
<employee>  <name/>     <dob/>  .....   <dept>deptnn</dept> </employee>  

dept1 是父级。即所有名称如dept11、dept12、dept13 ...的部门都是dept1的子集。类似dept2 是父级,所有名称为 dept21,dept22,dept23 的部门都是 dept2 的子集。
我想在 XqueryMarklogic API 的帮助下找到属于主要部门的员工列表,即属于 dept1、dept11、dept12 等的员工列表。
希望大家理解这个问题。

【问题讨论】:

  • 如果部门数量少于 10 个(否则我不明白如何解释 111 - 11-1 或 1-11),使用 Xath 1.0 您可以为每个部门获取 count(//employee//dept[starts-with(.,'dept2')])跨度>
  • 文档数为 n 且未使用 - 符号。它的 11、12、13 等。
  • @risabhv66 问题是,如果有超过 10 个部门,“dept111”是什么意思? 父母 'dept11' 的 1 号孩子父母 'dept1' 的 11 号孩子
  • 从我的例子中很明显没有 111 这样的东西。最大值将是 1n,其中 n 是 [0-9] 中的数字。

标签: xml xpath xquery marklogic marklogic-8


【解决方案1】:

可以更好地扩展的解决方案是使用dept 上的范围索引,使用cts:values 进行词典查找以获取dept 的唯一值及其频率。然后通过值进行普通循环以与父部门聚合频率。也许是这样的:

let $aggregates := map:map()
let $_ :=
  for $dept in cts:values(cts:element-reference(xs:QName("dept")))
  let $freq := cts:frequency($dept)
  let $parent := substring($dept, 1, 5)
  return map:put($aggregates, $parent, (map:get($aggregates, $parent), 0)[1] + $freq)
return $aggregates

为了更简单,您可以考虑通过将 XML 更改为以下内容来明确父部门:

<dept>dept1</dept><sub-dept>dept11</sub-dept>

这样,dept 上的cts:values 将立即提供顶级部门的准确频率计数,sub-dept 上的cts:values 将提供相同的子部门。

HTH!

【讨论】:

  • 你能解释一下这里发生了什么 - map:get($aggregates, $parent), 0)[1] + $freq) 吗?
  • (map:get($aggregates, $parent), 0)[1] 查看键 $parent 的值是否已知。如果不是,则选择 0。在其他语言中,您可以编写 map:get($aggregates, $parent) || 0,但不幸的是,在 XQuery 中不行。 + $freq 只是将当前部门的频率添加到父部门的频率中,使用 map:put 保存。
【解决方案2】:

现在我已经找到了解决方案。我敢肯定,可以有更好的方法来实现这一目标。

let $result := for $x in /doc/employee/dept[fn:starts-with(., "dept")] order by $x descending
                return $x
let $max := fn:codepoints-to-string(fn:string-to-codepoints($result[1])[5])
let $res := for $x in (1 to xs:integer($max))
              let $count := fn:count(/doc/employee/dept[fn:starts-with(., fn:concat("dept",xs:string($x)))])
              return (<doc><dept>dept{$x}</dept><count>{$count}</count></doc>)
return $res  

结果会像例子-

<doc>
  <dept>dept1</dept>
  <count>3</count>
</doc>
<doc>
  <dept>dept2</dept>
  <count>2</count>
</doc>
<doc>
  <dept>dept3</dept>
  <count>1</count>
</doc>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2020-04-09
    • 2019-06-23
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多