ROWS and RANGE differ exactly when there are ties

ROWS counts physical rows and RANGE counts values, so they are identical until two rows share an ordering value.

-- two orders at 14:22:31, same customer

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
--   row 1: 4900
--   row 2: 9800     ← each row sees itself and before

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
--   row 1: 9800
--   row 2: 9800     ← both see every PEER of the value

RANGE is the default when a frame is not stated, which is why the wrong answer is the one you get by not thinking about it. The result is not obviously broken — it is a running total that is slightly too large for the rows involved in a tie — so it survives review and is discovered by somebody reconciling a report against another system. Adding a unique tiebreaker to the ordering makes the two equivalent and is the simpler fix.