Номера групп по 45 в mysql - PullRequest
       6

Номера групп по 45 в mysql

0 голосов
/ 13 января 2020

У меня есть база данных, в которой я храню показания направления ветра в градусах. Мне нужно сделать две вещи на самом деле, мне нужно сгруппировать все показания по 45 (в основном 45 градусов между "N", "NE", "E", "SE", "S", "SW", "W" и " NW "), а затем мне нужно найти процент каждой из этих групп во всех чтениях.

Это то место, где я до сих пор застрял, мне удалось сгруппировать только по read_direction (пропуская часть, как на 45) и мне удалось отобразить процент.

select 
    reading_winddirection, 
    count, 
    round(count / total * 100) postotak 
from 
    ( 
        select reading_winddirection, count(reading_winddirection) count 
        from simulation_readings  
        group by reading_winddirection 
    ) c 
    JOIN ( 
        select count(*) total from simulation_readings  
    ) t

Это моя скрипка: MySql

За последние 30i sh минут мне удалось выяснить, как группировать по диапазонам чисел, так что это половина моей проблемы:

SELECT `reading_winddirection`, 
   Count(*) AS num 
FROM   (SELECT CASE 
             WHEN `reading_winddirection` >= 1 
                  AND `reading_winddirection` < 45 THEN '0-45' 
             WHEN `reading_winddirection` >= 45 
                  AND `reading_winddirection` < 90 THEN '45-90' 
             WHEN `reading_winddirection` >= 90 
                  AND `reading_winddirection` < 135 THEN '90-135' 
             WHEN `reading_winddirection` >= 135 
                  AND `reading_winddirection` < 180 THEN '135-180' 
             WHEN `reading_winddirection` >= 180 
                  AND `reading_winddirection` < 225 THEN '180-225' 
             WHEN `reading_winddirection` >= 225 
                  AND `reading_winddirection` < 270 THEN '225-270' 
             WHEN `reading_winddirection` >= 270 
                  AND `reading_winddirection` < 315 THEN '270-315' 
             WHEN `reading_winddirection` >= 315 
                  AND `reading_winddirection` < 360 THEN '315-360' 
           end AS `reading_winddirection` 
    FROM   simulation_readings 
    WHERE  1) AS price_summaries 
GROUP  BY reading_winddirection 

Мне просто нужно выяснить, каков процент всех групп в подсчете (*)

1 Ответ

1 голос
/ 13 января 2020

Одним простым решением было бы разделить reading_winddirection на 45, оставить только целую часть и использовать это для группировки.

select 
    case c.windgroup
        when 0 then 'N'
        when 1 then 'NE'
        when 2 then 'E'
        when 3 then 'SE'
        when 4 then 'S'
        when 5 then 'SW'
        when 6 then 'W'
        when 7 then 'NW'
    end windgroup,
    cnt,
    round(c.cnt / t.total * 100) postotak 
from 
    ( 
        select floor(reading_winddirection / 45) windgroup, count(*) cnt
        from simulation_readings  
        group by windgroup
    ) c 
    cross join ( 
        select count(*) total from simulation_readings  
    ) t

Примечание: если вы используете MySQL 8.0, вы можете использовать оконные функции вместо объединения для вычисления общего количества:

select 
    case floor(reading_winddirection / 45)
        when 0 then 'N'
        when 1 then 'NE'
        when 2 then 'E'
        when 3 then 'SE'
        when 4 then 'S'
        when 5 then 'SW'
        when 6 then 'W'
        when 7 then 'NW'
    end windgroup,
    count(*) cnt,
    round(100 * count(*) / sum(count(*)) over()) postotak 
from simulation_readings  
group by windgroup

В этой скрипте БД , оба запроса дают:

windgroup | cnt | postotak
:-------- | --: | -------:
N         |   6 |       60
E         |   2 |       20
SE        |   1 |       10
SW        |   1 |       10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...