Outro dia precisava montar um RANK de produtos, ou seja, precisava saber qual a classificação no RANK de cada produto com possibilidade de apresentar somente os primeiros 100 produtos.
Fazer RANK de dados não é um recurso disponível até o firebird 2.5 – o que irá ocorrer somente no firebird 3.0 – como ainda não é uma versão de produção, então o caminho ainda é resolver com o 2.5;
Depois de ler muitas sugestões de como fazer, conclui que tinha que montar uma própria – eram todas confusas e levavam a resultados com muito tempo de respostas.
Estratégia:
Montar um select que ordene em ordem crescente os valores de venda em ordem decrescente de cada um dos produtos, depois criar um loop que marque com uma coluna na resposta com a posição do produto (o RANK);
Código Delphi:
query1 := TFDQuery.create(nil); try with query1 do begin connection := xxx; sql.text := '....' open; end; .... finally query1.free; end;
Select no Firebird:
execute block returns (codigo varchar(18), valor double precision, conta integer, rank integer, acumulado double precision) as declare variable n integer; begin n = 0; acumulado = 0; for select codigo,sum(valor) valor, count(*) ct from sigcaut2 where valor>0 and data between '01/01/2015' and '12/31/2015' group by codigo order by valor desc rows 100 into :codigo,:valor,:conta do begin n = n +1; rank = n; acumulado = acumulado + valor; suspend; end end