Query strategies using SQL Server 2016 system-versioned temporal tables for Slowly-Changing Dimensions
I think, in your case a derived table is necessary to isolate querying number of mutations of postcodes  per customer:

SELECT c.postalcode 
, sum(s.SaleAmount) SaleAmount
, count(postcode_mutations.customerid) as CntCustomerChangedPostCode   
FROM dbo.Sale s
JOIN dbo.Customer c on s.customerid = c.customerid

LEFT JOIN (
SELECT 
    CustomerID
FROM [dbo].[Customer]
FOR SYSTEM_TIME FROM '20140101' TO '20150101'
GROUP BY CustomerID
HAVING COUNT(DISTINCT PostalCode) &gt; 1
) postcode_mutations on s.customerid = postcode_mutations.customerid

WHERE s.SaleDateTime &gt;= '2014-1-1' AND s.SaleDateTime &lt; '2015-1-1'
GROUP BY c.PostalCode


upd: Since the query is supposed to serve DWH/Analytics scenarios, the columnstore indexing is an option to check. I also made some benchmarks previously for a 10 million rows table.