SQL регистр запросов не дает правильных значений - PullRequest
0 голосов
/ 19 марта 2020

Первый набор запросов:

select count(distinct device_ifa) from table_1 where distance_diff <= 50  --  41504

select count(distinct device_ifa) from table_1  where distance_diff <= 100  --  69469

select count(distinct device_ifa) from table_1 where distance_diff <= 200  --  100859

должен точно соответствовать количеству запросов:

select case when distance_diff <= 50 then '50m'
            when distance_diff <= 100 then '100m'
            when distance_diff <= 200 then '200m' 
       end as radius, 
       count(distinct device_ifa) from table_1 
group by 1 order by 1


radius  _col1

100m   -    62512
200m    -   92547
50m      -   41504

Но количество не совпадает - может кто-нибудь помочь плз.

Ответы [ 3 ]

1 голос
/ 19 марта 2020

Да, это даст разные результаты, когда вы будете работать индивидуально и с указанием регистра. Индивидуально даст точное количество, которое вы упомянули, в то время как выписка с делом предоставит данные таким образом.

выберите случай, когда distance_diff <= 50, тогда '50m' - даст данные менее чем за 50 <br>когда distance_diff <= 100, то «100m» - даст данные между 50 и 100, поскольку результаты уже были включены как часть 50M, когда distance_diff <= 200, тогда «200m» - это даст от 100 до 200 как <100 уже является частью вышеуказанного утверждения. </p>

Чтобы получить точный подсчет, вы можете написать выписку по делу следующим образом

select 
       count(distinct case when distance_diff <= 50  then  device_ifa end ) 
Less_than_50, count(distinct case when distance_diff <= 100  then  device_ifa end ) 
Less_than_100 , count(distinct case when distance_diff <= 200  then  device_ifa end ) 
Less_than_200 from  table_1 
group by 1 order by 1
0 голосов
/ 19 марта 2020

Вы, кажется, спрашиваете, почему они дают разные результаты.

Причина проста. distance_diff из 25 учитывается во всех трех группах в первом запросе. Он подсчитывается только в группе < 50 для второго.

Первый возвращает совокупное различное число. Вторая возвращает отчетливый счетчик только для диапазона.

Результаты должны совпадать, если вы измените фильтр отдельных запросов для указанных диапазонов c:

where distance_diff <= 50
where distance_diff > 50 distance_diff <= 100
where distance_diff > 100 distance_diff <= 200
0 голосов
/ 19 марта 2020

Причина, по которой вы получаете другой счет, вызвана функциональностью оператора 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.

Надеюсь, теперь понятно, почему результаты в обоих запросах разные.

...