Usa l'espressione
field_c IS NOT NULL
come primo ORDER BY
elemento. Restituisce ...FALSE
.. se NULLTRUE
.. se NON NULLO.
E FALSE
(0) ordina prima di TRUE
(1). Funziona con qualsiasi tipo di dati e qualsiasi possibile distribuzione di valori.
SELECT field_a,
row_number() OVER (PARTITION BY field_b
ORDER BY field_c IS NOT NULL, field_c) AS row_number
FROM test_table
ORDER BY row_number;