Vom Grundsatz her ist ein WITH überall erlaubt, wo ein sog. Fullselect erlaubt ist.
Mittels WITH werden temporäre Ergebnistabellen gebildet.
Im Prinzip vereinfacht dies Abfragen, die man mittels Query in mehreren Schritten ausgeführt hat:
1. Query mit Ergebnis in Ausgabedatei
2. Query mit Ergebnis in Ausgabedatei
3. Query mit Join über diese Ausgabedateien und ggf. weiterer Tabellen

Dein Insert ist also soweit korrekt, da ein Fullselect im Anschluss möglich ist.

Mittels WITH können auch mehrere Zwischenergebnisse erzeugt werden:

with
TableA (F1, F2, ...) as select ....
[, TableB (F1, F2, ...) as select ...]
select ...

In den Subselects der einzelnen Zwischenergebnisse kann auch durchaus mittels Join Bezug genommen werden auf vorherige Zwischenergebnisse.

Das Ganze ist auch als Common-Table-Expression (o.ä.) bekannt.