Причина, по которой вы получаете другой счет, вызвана функциональностью оператора CASE.
case when distance_diff <= 50 then '50m'
when distance_diff <= 100 then '100m'
when distance_diff <= 200 then '200m'
end as radius
, когда вы выполняете запрос выше, когда данные перекрываются (например, условие <= 100 также включает <= 50, и аналогично для <= 200.). </p>
Как ведет себя вышеуказанный запрос ?:
1.distance_Diff <= 50: все значения distance_diff от 0 до 50 помечаются как '50m' </p>
2.distance_Diff <= 100: Это будет помечать все значение distance_diff от 51 до 100 как «100 м» </p>
3.distance_Diff <= 200: Это будет помечать все значение distance_diff от 101 до 200 как «200 м» </p>
Таким образом, условие 1 будет выполнено первым. затем он проверит оставшееся непомеченное значение для 2-го условия, а затем будет выполнено последнее 3-е условие.
, где, как и в первом запросе, где выполняется отдельный подсчет, также учитываются значения перекрытия.
select count(distinct device_ifa) from table_1 where distance_diff <= 50 -- 41504
Количество запросов выше distance_diff от 0 до 50.
select count(distinct device_ifa) from table_1 where distance_diff <= 100 -- 69469
Количество запросов выше distance_diff от 0 до 100.
select count(distinct device_ifa) from table_1 where distance_diff <= 200 -- 100859
Количество запросов выше distance_diff от 0 до 200.
Надеюсь, теперь понятно, почему результаты в обоих запросах разные.