Поделиться через


Оператор 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'))))   

Агрегатные функции

Предложение ORDER BY

Предложение ORDER IN GROUP