I would also prefer an APPLY based solution. Using AdventureWorks:
WITH
Data AS
(
SELECT
a.*
FROM Person.Address AS a
),
StateProvince AS
(
SELECT DISTINCT
d.StateProvinceID
FROM Data AS d
)
SELECT
Selected.AddressID,
Selected.AddressLine1,
Selected.AddressLine2,
Selected.City,
Selected.StateProvinceID,
Selected.PostalCode
FROM StateProvince
CROSS APPLY
(
SELECT TOP (30) PERCENT
d2.*
FROM Data AS d2
WHERE
d2.StateProvinceID = StateProvince.StateProvinceID
ORDER BY
d2.City
) AS Selected
ORDER BY
StateProvince.StateProvinceID,
Selected.City;
This seems much clearer to me. Proper indexing might be necessary on larger input sets.
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi