I want it [null] at the beginning, so null value is treated as smaller than all other values.
Use the expression
field_c IS NOT NULL
as first ORDER BY
item. It evaluates to ...
FALSE
.. if NULL
TRUE
.. if NOT NULL.
And FALSE
(0) sorts before TRUE
(1). Works for any data type and any possible distribution of values.
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;