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
- Intervalos de grupo
- Grupos de rotulagem
- Ordenando grupos
- Aninhando grupos
- Agrupamento em propriedades de vetor
- Mais exemplos
- Tópicos relacionados
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'))))
Tópicos relacionados