Compartilhar via


Instrução GROUP ON ... OVER ...

O GRUPO ATIVADO... SOBRE... statement retorna um conjunto de linhas hierárquico no qual os resultados da pesquisa são divididos em grupos com base em uma coluna especificada e intervalos de agrupamento opcionais. Se você agrupar na coluna System.Kind , o conjunto de resultados será dividido em vários grupos: um para documentos, outro para comunicações e assim por diante. Se você agrupar em System.Size e no intervalo de grupos de 100 KB, o conjunto de resultados será dividido em três grupos: itens de tamanho < de 100 KB, itens de tamanho >= 100 KB e itens sem valor de tamanho. Você também pode agregar agrupamentos com funções.

Este tópico aborda os seguintes assuntos:

Sintaxe

O GROUP ON... SOBRE... A instrução tem a seguinte sintaxe:

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

em que os intervalos de agrupamento são definidos da seguinte maneira:

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

A coluna> GROUP ON <pode ser um identificador regular ou delimitado para uma propriedade no repositório de propriedades.

O intervalo> de grupo opcional <é uma lista de um ou mais valores (número, data ou cadeia de caracteres) usados para dividir os resultados em grupos. O <limite> de intervalo identifica um ponto de divisão no conjunto de resultados retornado e identifica

O primeiro grupo de resultados inclui itens com o valor mínimo possível para a propriedade especificada até, mas não incluindo o primeiro limite de intervalo. Esse grupo pode ser referenciado com a palavra-chave MINVALUE. O segundo grupo pode ser referenciado com o próprio especificador de limite de intervalo e inclui itens cujo valor para a propriedade especificada é igual ou maior que o limite de intervalo. Todos os itens que não têm um valor para a propriedade especificada são retornados por último e podem ser referenciados com a palavra-chave NULL.

Por exemplo, um limite de intervalo de '2006-01-01' para a propriedade System.DateCreated divide o conjunto de resultados em itens com datas anteriores a 2006-01-01 (grupo MINVALUE), itens com datas em ou após 2006-01-01 (grupo 2006-01-01) e itens sem data (grupo NULL ).

Dentro de cada grupo, os resultados são classificados pelos valores na coluna GROUP ON por padrão. A cláusula ORDER BY opcional pode conter um especificador de direção de ASC para crescente (baixo a alto) ou DESC para decrescente (alta a baixa), e a cláusula ORDER IN GROUP BY pode ordenar cada grupo usando regras diferentes. Consulte a seção Grupos de Ordenação abaixo para obter mais informações.

Intervalos de grupo

A tabela a seguir demonstra como os resultados são divididos em grupos com base nos limites de intervalo:

Exemplo (<coluna> [intervalos de grupo]) Result
System.Size [1000, 5000] Os resultados são agrupados em quatro buckets: MINVALUE: Tamanho < 1000
1000: 1000 <= Tamanho < 5000
5000: Tamanho >= 5000
NULL: Nenhum valor para Size
System.Author [BEFORE('m'),AFTER('r')] Os resultados são agrupados em quatro buckets: MINVALUE: Criar < caractere antes de "m"
m: caractere antes de "m" <= Criar < caractere após "r"
r: caractere após "r" <= Autor
NULL: Nenhum valor para Author
System.Author [MINVALUE/'a to l',"m"/'m to z'] Os resultados são agrupados em três buckets: a a l: Author < "m"
m a z: "m" <= Author
NULL: Nenhum valor para Author
System.DateCreated ['2005-1-01','2006-6-01'] Os resultados são agrupados em quatro buckets:
MINVALUE: DateCreated < 2005-1-01
2005-1-01: 2005-1-01 <= DateCreated < 2006-6-01
2006-1-01: DateCreated >= 2006-6-01
NULL: Nenhum valor para DateCreated

 

 

Importante

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

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

 

 

Grupos de rotulagem

Para melhorar a legibilidade, você pode rotular grupos usando a seguinte sintaxe:

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

O rótulo é separado do limite de intervalo com uma barra e está entre aspas simples. Se você não especificar um rótulo, o nome do grupo será a cadeia de caracteres de limite de intervalo.

Veja a seguir um exemplo de grupos de rotulagem:

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

No Windows 7 ou posterior, você também pode usar um rótulo genérico [OTHER] para combinar vários intervalos de agrupamento. Os resultados de todos os grupos identificados com esse rótulo serão combinados em um grupo com esse rótulo. Esse grupo de resultados é retornado após todos os outros grupos, exceto para o grupo NULL . O grupo NULL contém resultados para itens que não têm um valor para a propriedade especificada. Antes do Windows 7, o rótulo [OTHER] é tratado como qualquer outro rótulo de grupo.

O código a seguir é um exemplo de como usar o rótulo [OTHER] para grupos que seriam criados no Windows 7 ou posterior:

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

A tabela a seguir mostra os grupos que seriam criados pelo código de agrupamento anterior no Windows 7 ou posterior.

Grupo System.Author System.FileName
0 1Bill Lorem.docx
Q Rainha Ipsum.docx
Robin dolor.docx
S Zara amet.docx
[OTHER] Abner nonummy.docx
Roberto laoreet.docx
Xaria magna.docx
NULL aliquam.docx

 

Ordenando grupos

Há três maneiras de solicitar itens em grupos:

  • Ordenação padrão: se você não especificar o contrário, os resultados serão ordenados pelos valores na coluna GROUP ON, em ordem crescente.
  • ORDER BY: você pode especificar a ordem decrescente em uma cláusula ORDER BY. Você deve ordenar os resultados pela coluna GROUP ON.
  • ORDER IN GROUP BY: você pode especificar uma ordem diferente para cada grupo. Se você agrupar em System.Kind, poderá solicitar documentos por System.Author e música por System.Music.Artist.

Para obter mais informações sobre como ordenar resultados, consulte as páginas de referência cláusula ORDER BY e ORDER IN GROUP Clause .

Aninhando grupos

Você pode aninhar grupos com várias cláusulas GROUP ON. A ordem especificada na consulta é refletida diretamente na hierarquia do grupo de saída, conforme mostrado no exemplo a seguir.

GROUP ON <System.Kind> 
      OVER (GROUP ON <System.Author> 
                  OVER (SELECT <System.DateCreated>))
System.Kind System.Author System.DateCreated
documentos Willa 2006-01-02
2006-01-05
Zara 2007-06-02
2007-09-10
comunicações Abner 2006-04-16
Jean 2007-02-20
Willa 2006-10-15
Zara 2008-01-02

 

 

Agrupamento em propriedades de vetor

O agrupamento em propriedades de vetor, propriedades que podem conter um ou mais valores simultaneamente, compara os valores de vetor individualmente por padrão. Por exemplo, se houver um documento, Lorem.docx, com a propriedade System.Author como "Theresa; Zara" e outro documento, Ipsum.docx, com a propriedade System.Author como "Zara", a consulta retorna o conjunto de resultados em dois grupos, conforme mostrado aqui:

GROUP ON <System.Author> 
      OVER (SELECT <System.FileName>)
System.Author System.FileName
Theresa Lorem.docx
Zara Lorem.docx
  Ipsum.docx

 

Como você pode ver, o agrupamento em propriedades de vetor retorna linhas duplicadas. Lorem.docx aparece duas vezes porque tem dois autores.

 

Mais exemplos

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'))))   

Funções agregadas

Cláusula ORDER BY

Cláusula ORDER IN GROUP