바람방향 텍스트 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하면 될 듯;;
그랬을 때 나오는 값을 특정 범위로 구분하여 바람의 방향을 표기해주면 되겠네요