Reproducing a ranking function that behaves like Excel's RANK
arr = {29400., 28200., 22300., 20900., 20300., 19800., 17400., 16600.,
16300., 16100., 15500., 15300., 15300., 15200., 15100., 14900.,
14700., 14700., 14400., 13900.}
From here
RANK gives duplicate numbers the same rank. However, the presence of duplicate numbers affects the ranks of subsequent numbers. For example, in a list of integers sorted in ascending order, if the number 10 appears twice and has a rank of 5, then 11 would have a rank of 7 (no number would have a rank of 6).
# /. Thread[Reverse@Sort@# -> Range[Length@#] ] &@arr
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 15, 16, 17, 17, 19, 20}
It feels clunky, but this gets you there,
q /. (Thread[# ->
First@First@Position[Reverse@Sort@q, #]] & /@ q)
(* {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 15, 16, 17, 17, 19, 20} *)
f[1, _] = 1;
f[n_, l1_] := If[l1[[n]] == l1[[n - 1]], f[n - 1, l1], n]
f[#, Sort[-l]] & /@ Range@Length@l
(* {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 15, 16, 17, 17, 19, 20}*)