SQL 질문 드립니다. 0 4 2,525

by 주성우 [SQL Query] 조회 SQL [2010.05.24 15:16:53]


SQL 질문 드립니다.
게시판에서 검색을 해봤는데 답을 찾기 어렵네요..ㅜㅜ

MSR_DATE SITE_ID DEVICE_ID ITEM_VAL
20100522000000 102 TN 0.3330
20100522000100 102 COD -0.8133
20100522000100 102 NH4 0.0142
20100522000100 102 NO2 0.0245
20100522000100 102 PO4 0.3790
20100522000100 102 TP 0.0129
20100522000200 102 NO3 0.0276
20100522010100 102 NH4 0.0115
20100522010100 102 NO3 0.0100
20100522010100 102 PO4 0.1489
20100522020000 102 TN 0.3704
20100522020100 102 COD -0.8888
20100522020100 102 NO2 0.0245
20100522020100 102 TP 0.0123
20100522020200 102 NH4 0.0197
20100522020200 102 NO3 0.0186
20100522020200 102 PO4 0.0028
20100522030100 102 NH4 0.0116
20100522030100 102 PO4 0.0050
20100522030200 102 NO3 0.0073
20100522040000 102 TN 0.2421

저장된 데이터는 위와 같은 포멧으로 저장됩니다.
위와 같은 형태로 저장된 데이터를 같은 시간에 대해서

MSR_DATE TN TP COD
05-13 00h -0.0247 0.0044 1.9744
05-13 02h -0.0275 0.0042 1.8625
05-13 04h -0.0246 1.7924
05-13 06h -0.0326 0.0072 2.7022
05-13 08h -0.0323 0.0149 2.7590
05-13 10h -0.0189 0.0104 2.2663
05-13 12h -0.0201 0.0086 2.7496
05-13 20h 0.5166
05-13 22h 0.4213 0.0187
05-14 00h 0.0005 0.0190
05-14 02h 0.3640 0.0173
05-14 04h 0.4788 0.0256
05-14 06h 0.5131 0.0221
05-14 08h 0.4834 0.0184
05-14 10h 0.4698 0.0185

처럼 데이터를 조회하려고 합니다.

아래와 같이 SQL을 작성해서 데이터를 조회하면 정상적으로 되는 것 같은데 가끔 데이터의 뒷 부분에 조인이 되지 않는 데이터가 출력되는 것 같습니다. 뭐가 문제일까요??

SELECT A.MSR_DATE, B.TN, C.TP, D.COD
FROM
(SELECT distinct SUBSTR(MSR_DATE,5,2) || '-' || SUBSTR(MSR_DATE,7,2) || ' ' || SUBSTR(MSR_DATE,9,2) || 'h' AS MSR_DATE FROM SD_DATA_DEVICE_RAW_TB WHERE SITE_ID = '102' AND DEVICE_ID IN ('TN', 'TP', 'COD') AND MSR_DATE >= '20100513000000' AND MSR_DATE < '20100523235900' ORDER BY MSR_DATE) A,
(SELECT SUBSTR(MSR_DATE,5,2) || '-' || SUBSTR(MSR_DATE,7,2) || ' ' || SUBSTR(MSR_DATE,9,2) || 'h' AS MSR_DATE, ITEM_VAL AS TN FROM SD_DATA_DEVICE_RAW_TB WHERE SITE_ID = '102' AND  MSR_DATE >= '20100513000000' AND MSR_DATE < '20100523235900' AND DEVICE_ID = 'TN' ORDER BY MSR_DATE) B,
(SELECT SUBSTR(MSR_DATE,5,2) || '-' || SUBSTR(MSR_DATE,7,2) || ' ' || SUBSTR(MSR_DATE,9,2) || 'h' AS MSR_DATE, ITEM_VAL AS TP FROM SD_DATA_DEVICE_RAW_TB WHERE SITE_ID = '102' AND  MSR_DATE >= '20100513000000' AND MSR_DATE < '20100523235900' AND DEVICE_ID = 'TP' ORDER BY MSR_DATE) C,
(SELECT SUBSTR(MSR_DATE,5,2) || '-' || SUBSTR(MSR_DATE,7,2) || ' ' || SUBSTR(MSR_DATE,9,2) || 'h' AS MSR_DATE, ITEM_VAL AS COD FROM SD_DATA_DEVICE_RAW_TB WHERE SITE_ID = '102' AND  MSR_DATE >= '20100513000000' AND MSR_DATE < '20100523235900' AND DEVICE_ID = 'COD' ORDER BY MSR_DATE) D
WHERE A.MSR_DATE = B.MSR_DATE(+) AND A.MSR_DATE = C.MSR_DATE(+) AND A.MSR_DATE = D.MSR_DATE(+);

그리고, 위와 같은 데이터에서 원하는 데이터를 얻기 위해서 좋은 SQL을 어떤식으로 작성하는 것이 조은 방법인지 조언 부탁드립니다.
by 마농 [2010.05.24 15:51:34]
SELECT SUBSTR(msr_date,5,2) || '-' || SUBSTR(msr_date,7,2) || ' ' || SUBSTR(msr_date,9,2) || 'h' AS msr_date
, MIN(DECODE(device_id,'TN',item_val)) AS tn
, MIN(DECODE(device_id,'TP',item_val)) AS tp
, MIN(DECODE(device_id,'COD',item_val)) AS cod
FROM sd_data_device_raw_tb
WHERE site_id = '102'
AND msr_date >= '20100513000000'
AND msr_date < '20100523235900'
AND device_id IN ('TN', 'TP', 'COD')
GROUP BY SUBSTR(msr_date,5,2) || '-' || SUBSTR(msr_date,7,2) || ' ' || SUBSTR(msr_date,9,2) || 'h'
ORDER BY msr_date
;

by 주성우 [2010.05.24 16:04:49]
마농님 감사합니다. 그런데 같은 시간에 데이터가 두 개 들어가는 경우에는 어떤식으로 처리해야 할까요??

by 마농 [2010.05.24 16:08:59]
글쎄요.
그건 어떤식으로 하나요? 라는 원천적인 질문보다는
어떤식으로 하고 싶은데 이렇게 처리하려면 sql을 어떻게 작성해야 할까요? 라고 질문하셔야 할듯 하네요.

2건을 하나로 합해서 보여주고 싶으시다면 min 을 sum 으로 바꾸고 해보세요.

by 주성우 [2010.05.24 16:13:08]
네.. 가끔 같은 시각(시간)에 데이터가 두 개가 들어오는 경우가 있는것 같아서 여쭤봤습니다.
그런 경우는 평균값을 사용하는게 맞는것 같은데 avg() 함수를 이용해서 도전해 보도록 하겠습니다.
답변 감사드립니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입