Eu tenho usado GROUP BY
para todos os tipos de consultas agregadas ao longo dos anos. Recentemente, eu tenho feito engenharia reversa de algum código que usa PARTITION BY
para realizar agregações. Ao ler toda a documentação que posso encontrar PARTITION BY
, parece muito GROUP BY
, talvez com alguma funcionalidade extra adicionada? São duas versões da mesma funcionalidade geral ou são algo completamente diferente?
fonte
Podemos dar um exemplo simples.
Considere uma tabela nomeada
TableA
com os seguintes valores:GROUP BY
Sintaxe:
Podemos aplicar
GROUP BY
em nossa tabela:Resultados:
Na nossa tabela real, temos 7 linhas e, quando aplicamos
GROUP BY id
, o servidor agrupa os resultados com base emid
:Em palavras simples:
PARTITION BY
Antes de ir para PARTITION BY, vejamos a
OVER
cláusula:De acordo com a definição do MSDN:
PARTITION BY não reduzirá o número de linhas retornadas.
Podemos aplicar PARTITION BY em nossa tabela de exemplos:
Resultado:
Veja os resultados - ele particionará as linhas e retornará todas as linhas, ao contrário de GROUP BY.
fonte
partition by
pode afetar o número de linhas, apenas não reduz o número de linhas.SELECT
paraSELECT DISTINCT
a segunda consulta? isso não retornaria o mesmo conjunto de dados que aGROUP BY
consulta? Quais são as razões para escolher um ou outro?partition by
na verdade, não acumula os dados. Permite redefinir algo em uma base por grupo. Por exemplo, você pode obter uma coluna ordinal dentro de um grupo particionando no campo de agrupamento e usandorownum()
sobre as linhas dentro desse grupo. Isso fornece algo que se comporta um pouco como uma coluna de identidade que é redefinida no início de cada grupo.fonte
Encontrado neste link: Cláusula OVER
fonte
Fornece dados acumulados sem acumular
suponha que eu queira retornar a posição relativa da região de vendas
Usando PARTITION BY, posso devolver o valor das vendas para uma determinada região e o valor MAX em todas as regiões de vendas na mesma linha.
Isso significa que você terá dados repetidos, mas pode atender o consumidor final no sentido de que os dados foram agregados, mas nenhum foi perdido - como seria o caso do GROUP BY.
fonte
PARTITION BY
é analítico, enquantoGROUP BY
é agregado. Para usarPARTITION BY
, você deve contê-lo com uma cláusula OVER .fonte
PARTITION BY is analytic
essa simples declaração esclareceu muito para mim. +1.Pelo que entendi, a Partição Por é quase idêntica ao Agrupar por, mas com as seguintes diferenças:
Na verdade, esse grupo agrupa o conjunto de resultados retornando uma linha por grupo, o que resulta, portanto, no SQL Server permitindo apenas na lista SELECT funções agregadas ou colunas que fazem parte do grupo por cláusula (nesse caso, o SQL Server pode garantir a existência de caracteres exclusivos). resultados para cada grupo).
Considere, por exemplo, o MySQL, que permite ter na lista SELECT colunas que não estão definidas na cláusula Group By, caso em que uma linha ainda está sendo retornada por grupo, no entanto, se a coluna não tiver resultados exclusivos, não haverá garantia qual será a saída!
Mas com Partition By, embora os resultados da função sejam idênticos aos resultados de uma função agregada com o Group By, você ainda está obtendo o conjunto de resultados normal, o que significa que um está obtendo uma linha por linha subjacente e não uma linha por grupo e, por esse motivo, pode ter colunas que não são exclusivas por grupo na lista SELECT.
Portanto, como um resumo, Agrupar por seria melhor quando precisar de uma saída de uma linha por grupo, e Partição por seria melhor quando alguém precisar de todas as linhas, mas ainda desejar a função agregada com base em um grupo.
É claro que também pode haver problemas de desempenho, consulte http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba .
fonte
Quando você usa
GROUP BY
, as linhas resultantes geralmente são menores que as linhas recebidas.Mas, quando você usa
PARTITION BY
, a contagem de linhas resultante deve ser igual à entrada.fonte
Suponha que tenhamos 14 registros de
name
coluna na tabelano
group by
dará contagem em fila única, ou seja, 14
mas em
partition by
vai 14 linhas de aumento na contagem
fonte
Pequena observação. Mecanismo de automação para gerar dinamicamente SQL usando a 'partição por', é muito mais simples de implementar em relação ao 'agrupar por'. No caso de 'agrupar por', devemos cuidar do conteúdo da coluna 'selecionar'.
Desculpe pelo meu Inglês.
fonte
Tem cenários de uso realmente diferentes. Ao usar GROUP BY, você mescla alguns dos registros das colunas iguais e possui uma agregação do conjunto de resultados.
No entanto, quando você usa PARTITION BY, seu conjunto de resultados é o mesmo, mas você só tem uma agregação nas funções da janela e não mescla os registros, ainda terá a mesma contagem de registros.
Aqui está um artigo útil que explica a diferença: http://alevryustemov.com/sql/sql-partition-by/
fonte
fonte