Tenho certeza de que estou perdendo uma solução óbvia para isso, mas estou tentando resumir valores para grupos definidos por um número de grupo explícito e uma ordenação implícita. Tenho certeza de que isso não torna isso muito mais claro, então digamos que eu tenha esta tabela de heap de origem de exemplo:
GroupID Value
----------- -----------
1 5
1 5
1 3
2 4
2 1
1 4
2 3
2 5
2 2
1 1
Gostaria de uma consulta que me fornecesse os seguintes resultados:
GroupID Values
----------- -----------
1 13
2 5
1 4
2 10
1 1
A ordenação implícita é o desafio que eu simplesmente não encontrei uma maneira de contornar... ainda. Qualquer ajuda seria apreciada.
Eu esperava poder criar uma ordem de linha determinística com uma consulta semelhante à seguinte:
SELECT *
, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
FROM Table WITH(TABLOCK)
OPTION (MAXDOP 1)
Espero que isso force uma varredura de ordem de alocação que me daria uma ordem de linha determinística.
Infelizmente, estou preso com os dados como estão. Não tenho outros indicadores aqui, como data, etc., que forneçam qualquer ordem definida. Minha esperança era que o truque descrito acima fosse suficiente, mas não estou totalmente certo de que será.
EDIT: Apenas para fechar isso, pois sei que havia perguntas sobre por que eu estava perguntando isso, eu tinha uma série de tabelas de heap, nomeadas por mês / ano, que continham valores de itens de linha que a empresa queria resumir por dia (que eles correlacionaram com os grupos implícitos na minha pergunta). Como não parece viável fazer isso de forma eficaz, decidimos agregar no nível do mês (por exemplo, tabela), então este post me ajudou a justificar a alteração nos requisitos de negócios. Obrigado pela contribuição de todos!
O grupo "implícito" que você menciona parece ser baseado na ordem das linhas. Ao contrário de uma planilha ou arquivo de texto, uma tabela relacional é logicamente um conjunto não ordenado de linhas, independentemente de estar armazenada como um heap ou ter um índice clusterizado. Não será possível escrever uma consulta para fornecer os resultados desejados, a menos que você tenha outra coluna para facilitar o agrupamento.
Desculpe ser o portador de más notícias, mas ordenar por um literal não garantirá ordenação determinística (e mesmo que isso aconteça, você precisaria de uma
ORDER BY
cláusula lá). Se parece fazê-lo, é apenas por acaso. Qualquer coluna incremental funcionará, no entanto.Uma varredura ordenada por alocação não é mais determinística do que qualquer outra implementação; você está apenas (inseguramente) confiando em um comportamento observado diferente.
Se você realmente deseja usar
%%physloc%%
, aqui está uma solução:%%physloc%%
é uma função de localizador de registro físico, você pode ler sobre isso aqui: SQL Server 2008: Nova função de localizador de linha física (não documentada)ATUALIZAR:
Como ypercubeᵀᴹ sugeriu, a ordem por
%%physloc%%
está incorreta, precisamos extrair o arquivo, paginar um slot e ordenar por elesEsta pergunta deve ser dirigida ao OP, não a mim. Minha solução é para heap estático que foi apresentado no Original Post.
Se o autor souber que este heap pode mudar, ele deve copiar este heap não para uma tabela temporária com coluna de identidade, mas para uma permanente.