programing

avg 및 그룹을 사용한 SQL 쿼리

skycolor 2023. 10. 19. 22:09
반응형

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

반응형