Оператор GROUP ON … OVER …
Группа on... НАД... Инструкция возвращает иерархический набор строк, в котором результаты поиска делятся на группы на основе указанного столбца и необязательных диапазонов группирования. Если группироваться в столбце System.Kind , результирующий набор делится на несколько групп: одну для документов, одну для обмена данными и т. д. Если группироваться в System.Size и диапазоне группы 100 КБ, результирующий набор делится на три группы: элементы размером < 100 КБ, элементы размером >100 КБ и элементы без значения размера. Вы также можете агрегировать группировки с помощью функций.
В этом разделе рассматриваются следующие темы:
- Синтаксис
- Диапазоны групп
- Группы меток
- Упорядочение групп
- Вложенные группы
- Группирование по свойствам вектора
- Дополнительные примеры
- Связанные темы
Синтаксис
Группа на ... НАД... Оператор имеет следующий синтаксис:
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.
Например, ограничение диапазона 2006-01-01 для свойства System.DateCreated делит результирующий набор на элементы с датами до 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: Нет значения для параметра Size |
System.Author [BEFORE('m'),AFTER('r')] | Результаты группируются в четыре сегмента: MINVALUE: символ автора < перед "m" m: character before "m" <= Author < character after "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: ДатаСоздание < 01.01.2005 2005-1-01: 2005-1-01 <= DateCreated < 2006-6-01 01.1.2006: DateCreated >= 01.06.2006 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 метка [OTHER] обрабатывается как любая другая метка группы.
Ниже приведен пример использования метки [OTHER] для групп, которые будут созданы в Windows 7 или более поздней версии:
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 |
Robin | dolor.docx | |
Да | Зара | amet.docx |
[OTHER] | Абнер | nonummy.docx |
Bob | laoreet.docx | |
Ксария | 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 |
---|---|---|
В документах | Willa | 2006-01-02 |
2006-01-05 | ||
Зара | 2007-06-02 | |
2007-09-10 | ||
IP-адресу (DIP) | Абнер | 2006-04-16 |
Жан | 2007-02-20 | |
Willa | 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'))))
Связанные темы