So arbeitet SQL nicht.
SQL erstellt keine temporären Zwischenergebnisse, sondern je Zeile werden alle Verbindungen und Berechnungen durchgeführt.

D.h., die Whereklausel für den Subselect auf a wird vor der Gruppierung und der Berechnung von Aggregaten durchgeführt:

1. Select inkl. aller Joins
2. Where-Klausel je Zeile aus 1.
3. Group By mit Aggregatbildung
4. Having Klausel (where auf Gruppenergebnsse)

Da du ja wahrscheinlich mehr Daten hast, als dein Beispiel oben aufzeigt, kann es trotz der Where-Klausel auf a zu mehreren Zeilen der Gruppe FF1-FF3 kommen.

Daher solltest du

min(fjj), min(fmm), min(ftt), min(fnr) as fnr

durch

min(fjj*10000+fmm*100+ftt) as mi

ersetzen.
Un die FNR dann zu erhalten kannst du den Extrakt via mod(mi, 100) erhalten.

Select b.*, mod(mi, 100) fnr
from b