Set operators answer membership questions ('which values appear in A but not B?') and membership has no counts — the dedup isn't a bug, it's the semantics. The trap is applying a membership tool to a quantity question: daily tallies, inventory movements, event streams — anywhere two identical rows are two facts. ALL variants subtract occurrences: EXCEPT ALL removes one match per match.
SELECT sp FROM morning EXCEPT SELECT sp FROM afternoon ORDER BY sp;
SELECT sp FROM morning EXCEPT ALL SELECT sp FROM afternoon ORDER BY sp;
The morning-minus-departures tally lost a resident — plain EXCEPT dedups as a side effect, so one of the two monarchs the morning legitimately had twice vanished; EXCEPT ALL subtracts one occurrence per match and keeps the other.
ALL variants for quantity semantics; or aggregate to counts first and compare counts (the explicit spelling).
EXCEPT/INTERSECT ALL are standard and in DuckDB/Postgres; some engines lack them — the GROUP-BY-counts comparison is the portable fallback.