Zlatan Ibrahimovic made the difference for Milan, as he scored along with Rafael Leao and had another disallowed, inflicting a fourth consecutive defeat on Cagliari.
Patrick Cutrone made his debut and SPAL wasted some great chances, but German Pezzella gave Fiorentina a much-needed victory.
Inter opened the scoring early with Lautaro Martinez, but Atalanta dominated possession in a 1-1 draw and saw Samir Handanovic save a late Luis Muriel penalty.
Ciro Immobile pounced on a disastrous David Ospina error to give Lazio their historic 10th consecutive Serie A victory, as Napoli were denied by the woodwork.
Parma got back on track with Simone Iacoponi and Andreas Cornelius goals, sending Lecce to a fourth consecutive defeat.
Juventus stunned Roma with an early couple of goals to secure their Winter Champion status, but Nicolò Zaniolo suffered a serious injury.
Sampdoria fought back from an early Brescia goal to emerge with a thumping 5-1 victory, including Fabio Quagliarella’s first home goals in eight months.
Torino rode their luck with an Alex Berenguer early goal, followed by Bologna – and particularly Rodrigo Palacio – missing sitters.
Udinese comfortably swept Sassuolo aside 3-0 with Rodrigo De Paul on target for the third game running, Stefano Okaka and Ken Sema.
Hellas Verona largely dominated the game, but still had to fight back for a 2-1 win over Davide Nicola’s Genoa.