avg 및 그룹을 사용한 SQL 쿼리
MySQL에 대한 SQL 쿼리 작성에 문제가 있습니다.저는 다음과 같은 구조의 테이블을 가지고 있습니다.
mysql> select id, pass, val from data_r1 limit 10;
+------------+--------------+----------------+
| id | pass | val |
+------------+--------------+----------------+
| DA02959106 | 5.0000000000 | 44.4007000000 |
| 08A5969201 | 1.0000000000 | 182.4100000000 |
| 08A5969201 | 2.0000000000 | 138.7880000000 |
| DA02882103 | 5.0000000000 | 44.7265000000 |
| DA02959106 | 1.0000000000 | 186.1470000000 |
| DA02959106 | 2.0000000000 | 148.2660000000 |
| DA02959106 | 3.0000000000 | 111.9050000000 |
| DA02959106 | 4.0000000000 | 76.1485000000 |
| DA02959106 | 5.0000000000 | 44.4007000000 |
| DA02959106 | 4.0000000000 | 76.6485000000 |
테이블에서 다음 정보를 추출하는 쿼리를 만들고 싶습니다.
id, AVG of 'val' for 'pass' = 1, AVG of 'val' for 'pass' = 2, etc
쿼리 결과는 다음과 같습니다.
+------------+---------+---------+---------+---------+---------+---------+---------+
| id | val_1 | val_2 | val_3 | val_4 | val_5 | val_6 | val_7 |
+------------+---------+---------+---------+---------+---------+---------+---------+
| DA02959106 | 186.147 | 148.266 | 111.905 | 76.3985 | 44.4007 | 0 | 0 |
+------------+---------+---------+---------+---------+---------+---------+---------+
물론 각각의 고유한 'id'에 대한 행이 더 많습니다.
나는 이미 다음과 같은 몇 가지 질문을 시도했습니다.
SELECT id, pass, AVG(val) AS val_1 FROM data_r1 WHERE pass = 1 GROUP BY id;
이것은 올바른 결과를 반환하지만, 가능한 다른 '통과' 값에 대한 결과로 확장해야 합니다(최대 7).
AVG 내에서 중첩된 SELECT를 사용하려고 했으나 현재 'id'로 정확하게 제한하는 방법을 알 수 없어 작동하지 않았습니다.
그런 다음 '통과' = 1, '통과' = 2 등에 대한 각 쿼리의 결과를 나타내는 보기를 만들었습니다.그러나 대부분의 ID에서 'pass'의 가장 높은 값은 5입니다.JOIN 쿼리를 사용하여 뷰에서 최종 결과를 얻을 때 일부 뷰가 비어 있거나 특정 'id' 값이 없기 때문에 빈 결과 집합을 받았습니다.
무슨 생각 있어요?
필요한 것이 무엇인지 이해가 된다면 다음을 시도해 보십시오.
SELECT id, pass, AVG(val) AS val_1
FROM data_r1
GROUP BY id, pass;
또는 ID마다 하나의 행만 원하는 경우 다음을 수행합니다.
SELECT d1.id,
(SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2
WHERE d2.id = d1.id AND pass = 1) as val_1,
(SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2
WHERE d2.id = d1.id AND pass = 2) as val_2,
(SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2
WHERE d2.id = d1.id AND pass = 3) as val_3,
(SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2
WHERE d2.id = d1.id AND pass = 4) as val_4,
(SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2
WHERE d2.id = d1.id AND pass = 5) as val_5,
(SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2
WHERE d2.id = d1.id AND pass = 6) as val_6,
(SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2
WHERE d2.id = d1.id AND pass = 7) as val_7
from data_r1 d1
GROUP BY d1.id
패스할 때마다 id별 평균값을 원하는 것으로 알고 있습니다.해결책은
SELECT id, pass, avg(value) FROM data_r1
GROUP BY id, pass;
아래와 유사한 데이터를 가진 두 개의 테이블이 있다고 가정합니다: DW
이드 | sensor_id | 양 |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 300 |
센서
이드 | 이름. |
---|---|
1 | 센서1 |
2 | 센서2 |
그리고 당신은 다음과 같은 결과를 원합니다.
신분증 | AVG_rows_센서 |
---|---|
1 | 150 |
2 | 300 |
위의 결과를 수신하기 위한 MySQL 쿼리:
센서_id에 의해 AVG(양)를 DW GROUP에서 AVG_rows_sensor로 선택합니다;
언급URL : https://stackoverflow.com/questions/10702546/sql-query-with-avg-and-group-by
'programing' 카테고리의 다른 글
부트스트랩 3의 입력 폭 (0) | 2023.10.19 |
---|---|
ImageView(이미지 보기)에서 "애니메이션 서클"을 사용하여 작업 로드 (0) | 2023.10.19 |
MariaDB 시퀀스가 음수를 생성하는 이유는 무엇입니까? (0) | 2023.10.19 |
AJAX post에서 Flask에 데이터를 가져오는 방법 (0) | 2023.10.19 |
테이블을 분할하기에 좋은 크기(행 수)는 무엇입니까? (0) | 2023.10.19 |