GROUP ON...多。。。陈述

The GROUP ON...多。。。语句返回分层行集,其中搜索结果根据指定的列和可选的分组范围划分为组。 如果在 system.Kind 列中对 分组,则结果集分为多个组:一个用于文档、一个用于通信等。 如果分组 System.Size 和组范围 100 KB,则结果集分为三个组:大小 < 100 KB 的项目、大小 >= 100 KB 的项目以及没有大小值的项。 还可以使用函数聚合分组。

本主题涵盖以下主题:

语法

GROUP ON...多。。。语句具有以下语法:

GROUP ON <column> ['['<group ranges>']']] 
[AGGREGATE <aggregate_function>] 
[ORDER BY <column> [<direction>]] | [ORDER IN GROUP '<group name>' BY <column> [<direction>]]
    OVER (GROUP ON... | SELECT... ] )

其中,分组范围的定义如下:

<group ranges> := <range limit> [/'<label>'] | <range limit> [/'<label>'], <group ranges>
<range limit> := (<number> | <date> | '<string>' | BEFORE('<string>') | AFTER('<string>')) 

GROUP ON <列> 可以是属性存储中属性的常规或分隔 标识符

可选的 <组范围> 是用于将结果划分为组的一个或多个值(数字、日期或字符串)的列表。 <范围限制> 标识返回的结果集中的除点,

第一组结果包括指定属性的最小可能值但不包括第一个范围限制的项目。 可以使用 MINVALUE 关键字引用此组。 可以使用范围限制说明符本身引用第二个组,并包括指定属性的值等于或大于范围限制的项。 不具有指定属性值的任何项都将返回最后一个,可以使用 NULL 关键字引用。

例如, System.DateCreated 属性的范围限制为“2006-01-01”,将结果集划分为日期为 2006-01-01 之前的项 (MINVALUE 组)、日期在 2006-01-01(2006-01-01 组)之后的项目,以及没有日期的项目(NULL 组)。

在每个组中,结果默认按 GROUP ON 列中的值进行排序。 可选的 ORDER BY 子句可以包含 ASC 的升序(低到高)或 DESC 的一个方向说明符(降序(高到低),ORDER IN GROUP BY 子句可以使用不同的规则对每个组进行排序。 有关详细信息,请参阅下面的 排序组 部分。

组范围

下表演示了如何根据范围限制将结果划分为组:

示例(<列> [组范围]) 结果
System.Size [1000, 5000] 结果分为四个存储桶:MINVALUE:大小 < 1000
1000: 1000 <= 大小 < 5000
5000: 大小 >= 5000
NULL: 没有大小值
System.Author [BEFORE('m'),AFTER('r')] 结果分为四个存储桶:MINVALUE:“m”之前的作者 < 字符
< 字符 = “r” 后作者 < 字符
r: “r” <= Author 之后的字符
NULL: Author 没有值
System.Author [MINVALUE/'a to l',“m”/'m to z'] 结果分为三个存储桶:a 到 l: Author <“m”
m 到 z:“m”<= Author
NULL: Author 没有值
System.DateCreated ['2005-1-01','2006-6-01'] 结果分为四个存储桶:
MINVALUE: DateCreated < 2005-1-01
2005-1-01: 2005-1-01 <= DateCreated < 2006-6-01
2006-1-01: DateCreated >= 2006-6-01
NULL: DateCreated 无值

 

 

重要

不正确:GROUP ON System.Author['m','z','a']

正确:GROUP ON System.Author['a','m','z']

 

 

标记组

若要提高可读性,可以使用以下语法标记组:

GROUP ON <column> [<range limit>/'<label>',<range limit>/'<label>']

该标签与范围限制隔开,带有斜杠标记,并用单引号引起来。 如果未指定标签,则组名称为范围限制字符串。

下面是标记组的示例:

GROUP ON System.Size [(MINVALUE/'Small','100')/'Medium','50000'/'Large']
    OVER (SELECT System.Size FROM SystemIndex)

在 Windows 7 或更高版本中,还可以使用泛型 [OTHER] 标签来组合多个分组范围。 使用此标签标识的所有组的结果将组合到一个具有此标签的组中。 除 NULL 组之外,其他所有组都返回此组结果。 NULL 组包含的项的结果没有指定属性的值。 在 Windows 7 之前,将像对待任何其他组标签一样对待 [其他] 标签。

以下代码是对将在 Windows 7 或更高版本中创建的组使用 [OTHER] 标签的示例:

GROUP ON System.Author ['0', 'A'/'[OTHER]', 'I', 'Q', 'W'/'[OTHER]', 'Y']
    OVER (SELECT System.DateCreated FROM SystemIndex)

下表显示了将由 Windows 7 或更高版本中的上述分组代码创建的组。

System.Author System.FileName
0 1Bill Lorem.docx
Q 女王 Ipsum.docx
知更鸟 dolor.docx
Y 扎拉 amet.docx
[其他] Abner nonummy.docx
鲍勃 laoreet.docx
Xaria magna.docx
NULL aliquam.docx

 

排序组

可通过三种方式对组中的项目进行排序:

  • 默认排序:如果未指定其他顺序,则结果按 GROUP ON 列中的值按升序排序。
  • ORDER BY:可以在 ORDER BY 子句中指定降序顺序。 必须按 GROUP ON 列对结果进行排序。
  • ORDER IN GROUP BY:可以为每个组指定不同的顺序。 如果分组 System.Kind,则可以 System.Author 和音乐 System.Music.Artist对文档进行排序。

有关排序结果的详细信息,请参阅 ORDER BY 子句ORDER IN GROUP 子句 参考页。

嵌套组

可以使用多个 GROUP ON 子句嵌套组。 查询中指定的顺序直接反映在输出组层次结构中,如以下示例所示。

GROUP ON <System.Kind> 
      OVER (GROUP ON <System.Author> 
                  OVER (SELECT <System.DateCreated>))
System.Kind System.Author System.DateCreated
文件 威拉 2006-01-02
2006-01-05
扎拉 2007-06-02
2007-09-10
通信 Abner 2006-04-16
2007-02-20
威拉 2006-10-15
扎拉 2008-01-02

 

 

对向量属性进行分组

在矢量属性上分组,可以同时包含一个或多个值的属性默认情况下单独比较向量值。 例如,如果有一个文档,Lorem.docx,System.Author 属性为“Theresa;Zara“和另一个文档,Ipsum.docx,System.Author 属性为”Zara“,查询将返回两个组中的结果集,如下所示:

GROUP ON <System.Author> 
      OVER (SELECT <System.FileName>)
System.Author System.FileName
特里萨 Lorem.docx
扎拉 Lorem.docx
  Ipsum.docx

 

可以看到,对向量属性进行分组将返回重复行。 Lorem.docx 出现两次,因为它有两个作者。

 

更多示例

GROUP ON System.Photo.ISOSpeed [0,10,100] 
      OVER (SELECT System.ItemName, System.Size, System.ItemUrl FROM SystemIndex)
            
GROUP ON System.DateCreated['2005/01/01 00:00:00', '2005/12/30 23:00:00'] 
      OVER (SELECT System.ItemName, System.Size, System.ItemUrl FROM SystemIndex)
            
GROUP ON System.Author ORDER BY System.Author DESC 
      OVER (GROUP ON System.DateCreated ORDER BY System.DateCreated ASC 
                  OVER (SELECT System.FileName, System.DateCreated, System.Size FROM SystemIndex 
                        WHERE CONTAINS(*, 'text')))

GROUP ON System.ItemName [before('a'), 'a', before ('c'), 'd', after('d')] 
      OVER (SELECT System.ItemName, System.ItemUrl FROM SystemIndex ORDER BY System.ItemName)                        
                        
GROUP ON System.ItemNameDisplay ['a' / 'col_a','c' / 'col_c'] 
      OVER (SELECT System.ItemNameDisplay FROM SystemIndex 
            ORDER BY System.ItemNameDisplay)

GROUP ON System.Size[1,2] 
      OVER (GROUP ON System.Author['a','f','mc','x'] 
                  OVER (GROUP ON System.DateCreated['2005/07/25 07:00:00', '2005/08/25 07:00:00']
                        ORDER BY System.DateCreated DESC 
                              OVER (SELECT System.FileName FROM SystemIndex 
                                    WHERE CONTAINS('text'))))   

聚合函数

ORDER BY 子句

ORDER IN GROUP 子句