GROUP ON ... OVER ... 语句

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

本主题涵盖以下主题:

语法

GROUP ON...OVER...语句具有以下语法:

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 关键字 (keyword) 引用此组。 第二个组可以使用范围限制说明符本身进行引用,包括指定属性的值等于或大于范围限制的项。 没有指定属性值的任何项最后返回,并且可以使用 NULL 关键字 (keyword) 引用。

例如, 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 子句可以使用不同的规则对每个组进行排序。 有关详细信息,请参阅下面的 排序组 部分。

组范围

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

示例 (<列> [group ranges]) 结果
System.Size [1000, 5000] 结果分为四个存储桶: MINVALUE:大小 < 1000
1000: 1000 <= 大小 < 5000
5000: 大小 >= 5000
空: 大小没有值
System.Author [在 ('m') 之前,在 ('r') ] 结果分为四个存储桶: MINVALUE: “m”之前的 Author < 字符
m: “m <”之前的字符 = “r” 后的 Author < 字符
r: “r” <= Author 后面的字符
空: 作者没有值
System.Author [MINVALUE/'a to l',“m”/'m to z'] 结果分为三个存储桶: a 到 l: Author < “m”
m 到 z: “m” <= 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
空: 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 或更高版本中的上述分组代码创建的组。

Group System.Author System.FileName
0 1Bill Lorem.docx
Q 女王 Ipsum.docx
Robin dolor.docx
Y Zara amet.docx
[其他] Abner nonummy.docx
Bob 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
Zara 2007-06-02
2007-09-10
通信 Abner 2006-04-16
2007-02-20
威拉 2006-10-15
Zara 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
Zara 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 子句