Estou calculando mediana como:
DECLARE @TEMP TABLE
(
ID INT
)
Select
(
(
Select Top 1 ID
From
(
Select Top 50 Percent ID
From @Temp
Where ID Is NOT NULL
Order By ID
) As A
Order By ID DESC
) +
(
Select Top 1 ID
From
(
Select Top 50 Percent ID
From @Temp
Where ID Is NOT NULL
Order By ID DESC
) As A
Order By ID Asc
)
) / 2
Consulta acima que eu quero usar. Mas, no meu caso, há tantos columns
para aqueles que quero calcular MEDIAN
. Mas acho que seria ruim repetir o bloco de código acima para cada arquivo column
. Então, estou tentando definir uma função separada que aceite column
valores, processe e retorne a mediana. Devo definir table-value-funtion
isso ou há outra optimized
maneira de fazer isso?
Esta questão está relacionada com as seguintes questões:
- Como escrever a função em sql que aceita tabela como entrada e retorna o resultado como tabela?
- Obtendo o erro "deve declarar a variável escalar" na função SQL, mesmo que seja declarada
- por que não é possível executar a função com valor de tabela?
- https://dba.stackexchange.com/questions/127328/how-to-use-udf-function-in-insert-into-select-from-clause
- Calculando várias medianas
Existem maneiras muito mais eficientes de calcular uma mediana simples ou agrupada do que a mostrada em sua pergunta:
Qual é a maneira mais rápida de calcular a mediana?
Melhores abordagens para mediana agrupada
O vencedor geral de 2012 é um método de Peter Larsson. O padrão é:
Mediana Simples
Mediana Agrupada
Para maximizar o desempenho do
OFFSET
método acima, pode ser necessário adicionar uma dica de bloqueio (tópico avançado). A indexação adequada também será necessária, é claro.Reutilização de código
Isso é difícil de conseguir diretamente com uma função T-SQL, pois elas não permitem a execução de SQL dinâmico (supondo que você esteja pensando em passar o nome da coluna).
Existem várias maneiras de contornar isso, incluindo o uso de uma função para gerar o próprio texto SQL dinâmico, que pode ser executado pelo chamador. Não há detalhes suficientes na pergunta para dizer qual abordagem seria mais adequada para você.
Se você deseja calcular um valor mediano, existem algumas maneiras de fazer isso, dependendo da versão do SQL Server em que você (ou outra pessoa, talvez) esteja. Dwain Camps escreveu dois artigos para o Simple Talk nos quais coletou várias opções T-SQL puras de várias pessoas, deu exemplos de cada uma e comparou seu desempenho:
Calculando o valor mediano dentro de um conjunto particionado usando T-SQL
O desempenho das funções da janela T-SQL
No entanto, não acho que você possa encapsular nenhum desses métodos em uma função para fácil reutilização. Para isso, você precisaria usar o SQLCLR para criar um agregado definido pelo usuário (UDA). Escrevi um artigo há vários anos mostrando como criar um UDA, usando Median como exemplo :-)
Obtendo o máximo dos UDTs e UDAs do SQL Server 2005
Em relação a esse artigo, lembre-se:
GZipStream
material e mudarMaxByteSize
de8000
para-1
.Veja também: