Я думаю, если я правильно понял вопрос, то что-то вроде этого должно сработать ..
SELECT
s1.app_id,
s1.os_version,
count(*)
FROM stats s1 INNER JOIN stats s2 ON s1.app_id = s2.app_id
AND s2.os_version >= s1.os_version
GROUP BY s1.app_id, s1.os_version
РЕДАКТИРОВАТЬ: Это возвращает результаты, подогнанные app_id (как в примере запроса ввопрос)
SELECT
s1.app_id,
s1.os_version,
count(*)
FROM stats s1 INNER JOIN stats s2 ON s1.app_id = s2.app_id
AND s2.os_version >= s1.os_version
WHERE s1.app_id = 'app1'
GROUP BY s1.app_id, s1.os_version
РЕДАКТИРОВАТЬ 2:
SELECT
s1.app_id,
s1.os_version,
count(*)
FROM stats s1 INNER JOIN stats s2 ON s1.app_id = s2.app_id
AND s2.os_version >= s1.os_version
AND s1.app_id = 'app1'
GROUP BY s1.app_id, s1.os_version
РЕДАКТИРОВАТЬ3: Чтобы обойти проблему 2,11 <2,7 </p>
SELECT
s1.app_id,
s1.os_version,
count(*)
FROM stats s1 INNER JOIN stats s2 ON s1.app_id = s2.app_id
AND CAST(REPLACE(s2.os_version, '.', '') TO INTEGER) >=
CAST(REPLACE(s1.os_version, '.', '') TO INTEGER)
AND s1.app_id = 'app1'
GROUP BY s1.app_id, s1.os_version