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'))))
相关主题