Estou tentando usar NTILE em meus dados usando um tipo de dados float em minha cláusula PARTITION BY. Por favor, desculpe o exemplo artificial, mas acho que a melhor maneira de ilustrar minha pergunta e confusão é por meio deste código:
CREATE TABLE Test
(
Cash float NOT NULL,
Number int NOT NULL
)
GO
INSERT INTO TEST VALUES(1.05,1);
INSERT INTO TEST VALUES(1.368,1);
INSERT INTO TEST VALUES(0.775,1);
INSERT INTO TEST VALUES(1.699,1);
INSERT INTO TEST VALUES(1.599,1);
INSERT INTO TEST VALUES(0.80,1);
INSERT INTO TEST VALUES(0.80,1);
INSERT INTO TEST VALUES(0.994,1);
INSERT INTO TEST VALUES(0.848,1);
INSERT INTO TEST VALUES(0.675,1);
INSERT INTO TEST VALUES(0.575,1);
INSERT INTO TEST VALUES(12.998,1);
INSERT INTO TEST VALUES(1.999,1);
INSERT INTO TEST VALUES(0.65,1);
INSERT INTO TEST VALUES(0.80,1);
INSERT INTO TEST VALUES(2.60,1);
SELECT CASH,
NTILE(3) OVER (PARTITION BY Cash ORDER BY Cash) AS Trio
INTO #Test
FROM Test
Eu esperava que os agrupamentos fossem algo assim:
0.575 1
0.65 1
0.675 1
0.775 1
0.8 1
0.8 2
0.8 2
0.848 2
0.994 2
1.05 2
1.368 3
1.599 3
1.699 3
1.999 3
2.6 3
12.998 3
Mas, em vez disso, o conjunto de resultados se parece com isso:
CASH Trio
0.575 1
0.65 1
0.675 1
0.775 1
0.8 1
0.8 2
0.8 3
0.848 1
0.994 1
1.05 1
1.368 1
1.599 1
1.699 1
1.999 1
2.6 1
12.998 1
E os agrupamentos de intervalo parecem realmente estranhos quando máximo e mínimo são aplicados por grupo
SELECT
MAX(CASH), MIN(CASH), Trio
FROM #Test
GROUP BY Trio
MAX MIN TRIO
12.998 0.575 1
0.8 0.8 2
0.8 0.8 3
Alguém pode explicar o que está acontecendo aqui?
A
NTILE
função divide uma entrada definida emN equal
grupos de tamanho. Para determinar quantas linhas pertencem a cada grupo, o SQL Server deve primeiro determinar o número total de linhas no conjunto de entrada.Se a função NTILE incluir uma
PARTITION BY
cláusula, o SQL Server deverá calcular o número de linhas em cada partição separadamente. Uma vez que sabemos o número de linhas em cada partição, podemos escrever a função NTILE comoonde
COUNT(*)
é o número de linhas em cada partição.Levando em consideração o que foi dito acima, abaixo explicarei:
Consulte: Funções de classificação: RANK, DENSE_RANK e NTILE