바람방향 텍스트 avg 뽑을 수 있는 방법 문의드려요

바람방향 텍스트 avg 뽑을 수 있는 방법 문의드려요

QA

바람방향 텍스트 avg 뽑을 수 있는 방법 문의드려요

본문

안녕하세요 

재질문 올려봅니다.. 아래 답변은 정말 많은 도움이 되었습니다. 감사합니다.


mysql db 에

table name : test
<row data>
date        time    wind
20221219  121223  북풍
20221219  112223  남서풍
20221219  111223  북서풍
20221219  101123  남동풍
20221219  100923  남동풍
20221219  100223  남서풍
20221219  100221  남풍
20221219  100211  남동풍
20221219  100141  남풍

select avg(wind) from test
해 보았는데 숫자 값이 아니라서 그런지 text 값은 avg 값이 0으로만 리턴되던데요
어떻게 하면 위 형식의 데이터에서 평균 데이터 텍스트를 뽑을 수 있나요?

즉 avg는 남동풍 이 뽑혀야 하는데 안되어서 문의드립니다.
min(wind) 은 북풍
max(wind) 은 남동풍 이 뽑힙니다.

많약 avg가 숫자만 가능하다면
php소스 변수 처리로 어떻게 하면 되는가요?

혹은 숫자로 치환해서 avg 구한뒤에 다시 text 로 값을 변수로 변환하는 방법도 가능한가요?


귀한 답변 부탁드립니다.
감사합니다.

이 질문에 댓글 쓰기 :

답변 5

바람 방향 평균이라는 의미가 무엇을 의미하는지,

그리고 어떤 목적으로 평균을 내는지에 따라 달라지지 않을까 합니다.

일단 텍스트를 평균으로 내는 건 불가합니다.

위의 예시에서 평균을 내었을때 남동풍이 나와야 한다면, 그건 평균이 아니라, 해당 데이터에서 가장 많은 값이 아닌가요?

 

 

안녕하세요.

AVG의 경우 컴럼의 자료형이 숫자만 가능합니다.

숫자로 치환해서 하시던지 아니면 wind2 (숫자) 등을 추가로 만들어 평균을 내어보세요

아래의 내용도 참고를 해보세요.

https://m-datastudy.tistory.com/10

 

카운팅 횟수에 대한 평균값 중간위치 추출이 목적이라면

이런식으로 응용을 해볼수는 있을것 같습니다.

 

- Version


SELECT VERSION();
/*
+------------+
| VERSION()  |
+------------+
| 5.7.32-log |
+------------+
*/

 

- DDL


CREATE TABLE test(
    `date` int(11) not null,
    `time` int(11) not null,
    `wind` varchar(50) not null
);

 

- Query


-- query-01
SELECT 
     winds 
    -- ,wind_cnt 
    -- ,rnum 
    -- ,CEIL(@rownum / 2) - (@rownum % 2) x 
FROM 
    (
    -- query-00
    SELECT 
        (@rownum := @rownum + 1) rnum, wind_cnt, GROUP_CONCAT(wind) winds
    FROM 
        (SELECT wind, COUNT(wind) wind_cnt, @rownum := 0 from test GROUP BY wind) tmp 
    GROUP BY wind_cnt 
    ) tmp 
WHERE 
    rnum > CEIL(@rownum / 2) - (@rownum % 2)
LIMIT 1 OFFSET 0
;

 

* 아래부터는 각 DML 에 대한 query-00, query-01 결과 이고

어디까지나 테스트를 위한 구문이니 실제 적용할 쿼리에는 포함되지 않도록 주의하세요

 

- case-1


TRUNCATE table test;
INSERT INTO test VALUES 
     (20221219, 121223, '북풍')
    ,(20221219, 112223, '남서풍')
    ,(20221219, 111223, '북서풍')
    ,(20221219, 101123, '남동풍')
    ,(20221219, 100923, '남동풍')
    ,(20221219, 100223, '남서풍')
    ,(20221219, 100221, '남풍')
    ,(20221219, 100211, '남동풍')
    ,(20221219, 100141, '남풍')
;
/*
+------+----------+------------------+
| rnum | wind_cnt | winds            |
+------+----------+------------------+
|    1 |        1 | 북풍,북서풍      |
|    2 |        2 | 남풍,남서풍      |
|    3 |        3 | 남동풍           |
+------+----------+------------------+
+------------------+
| winds            |
+------------------+
| 남풍,남서풍      |
+------------------+
*/

 

- case-2


TRUNCATE table test;
INSERT INTO test VALUES 
     (20221219, 121223, '북풍')
    ,(20221219, 112223, '남서풍')
    ,(20221219, 111223, '북서풍')
    ,(20221219, 101123, '남동풍')
    ,(20221219, 100923, '남동풍')
    ,(20221219, 100223, '남서풍')
    ,(20221219, 100221, '남풍')
    ,(20221219, 100211, '남동풍')
    ,(20221219, 100141, '남풍')
    ,(20221219, 100141, '동풍')
    ,(20221219, 100141, '동풍')
    ,(20221219, 100141, '동풍')
    ,(20221219, 100141, '동풍')
    ,(20221219, 100141, '동풍')
    ,(20221219, 100141, '서풍')
    ,(20221219, 100141, '서풍')
    ,(20221219, 100141, '서풍')
    ,(20221219, 100141, '서풍')
    ,(20221219, 100141, '서풍')
    ,(20221219, 100141, '서풍')
    ,(20221219, 100141, '서풍')
    ,(20221219, 100141, '남동풍')
;
/*
+------+----------+------------------+
| rnum | wind_cnt | winds            |
+------+----------+------------------+
|    1 |        1 | 북풍,북서풍      |
|    2 |        2 | 남풍,남서풍      |
|    3 |        4 | 남동풍           |
|    4 |        5 | 동풍             |
|    5 |        7 | 서풍             |
+------+----------+------------------+
+-----------+
| winds     |
+-----------+
| 남동풍    |
+-----------+
*/

 

- case-3


TRUNCATE table test;
INSERT INTO test VALUES 
     (20221219, 121223, '1풍')
    ,(20221219, 121223, '2풍')
    ,(20221219, 121223, '2풍')
    ,(20221219, 121223, '3풍')
    ,(20221219, 121223, '3풍')
    ,(20221219, 121223, '3풍')
    ,(20221219, 121223, '3풍')
    ,(20221219, 121223, '4풍')
    ,(20221219, 121223, '4풍')
    ,(20221219, 121223, '4풍')
    ,(20221219, 121223, '4풍')
    ,(20221219, 121223, '4풍')
    ,(20221219, 121223, '4풍')
    ,(20221219, 121223, '4풍')
    ,(20221219, 121223, '4풍')
;
/*
+------+----------+-------+
| rnum | wind_cnt | winds |
+------+----------+-------+
|    1 |        1 | 1풍   |
|    2 |        2 | 2풍   |
|    3 |        4 | 3풍   |
|    4 |        8 | 4풍   |
+------+----------+-------+
+-------+
| winds |
+-------+
| 3풍   |
+-------+
*/

방향을 벡터로 처리하면 될 거 같습니다.

바람 세기를 고려하지 않는다면 벡터 크기를 1로 잡고,

북-(0,1)

동-(1,0)

북동-(1,1) 정확하게는 (1/✓2, 1/✓2)

평균은 벡터 합을 구하고 N으로 나누어주면 되지 않을까요

wind의 값을 텍스트 말고 0~359도로 지정해서 각 바람별 각도를 넣어서 avg하면 될 듯;;

그랬을 때 나오는 값을 특정 범위로 구분하여 바람의 방향을 표기해주면 되겠네요

아...그러네요;;
합이 360이 발생하면 반대방향...ㄷㄷ
그러면 90도마다 1~4분기로 분기를 같이 기입해서 따로 평균해서 방향을 잡으면 되지 않을까요?
이것도 분기가 상쇄되는 지점이 오면 표기할 방법이 없네요;;

답변을 작성하시기 전에 로그인 해주세요.
전체 123,682 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT