2009-08-07 3 views
0

우선 i5/OS V5R4 용 DB2에서 실행 중입니다. ROW_NUMBER(), RANK() 및 공통 테이블식이 있습니다. 나는 이 아니고에는 TOP n PERCENT 또는 LIMIT OFFSET이 있습니다.GROUP BY를 사용하는 DB2 SQL - 중간

내가 작업하고있는 실제 데이터 세트는 설명하기 어렵 기 때문에 열이 (city, temperature, timestamp) 인 날씨 기록 테이블이 있다고 가정 해 보겠습니다. 각 그룹의 평균에 대한 중간 값을 비교하고 싶습니다. (city).

이것은 전체 테이블 집계에 대한 중앙값을 얻는 데 가장 깨끗한 방법입니다. 다시 하나의 행을 얻기 위해 잘 작동

WITH base_t AS 
(SELECT temp, row_number() over (order by temperature) AS rownum FROM t), 
count_t AS 
(SELECT COUNT(temperature) + 1 AS base_count FROM base_t), 
median_t AS 
(SELECT temperature FROM base_t, count_t 
    WHERE rownum in (FLOOR(base_count/2e0), CEILING(base_count/2e0))) 
SELECT DECIMAL(AVG(temperature),10,2) AS median FROM median_t 

을하지만, 그룹화에 무너져 버릴 것 : 나는 IBM 레드 북 here에서 적응.


SELECT city, AVG(temperature), MEDIAN(temperature) FROM ... 
 
city   | mean_temp  | median_temp  
=================================================== 
'Minneapolis' | 60    | 64 
'Milwaukee' | 65    | 66 
'Muskegon'  | 70    | 61 

나를 바보로 만드는 답이있을 수 있습니다,하지만 난 정신 블록을 보내고있어이 지금의 일을 내 # 1 일이 아니다 : 개념적으로,이 제가 원하는 것입니다. 가능할 수있는 것 같지만 커다란 테이블이기 때문에 매우 복잡한 것을 사용할 수없고 집계되는 열을 사용자 정의 할 수있는 기능이 필요합니다.

답변

1

SQL Server에서는 count (*)와 같은 기능을 그룹화하지 않고 그룹화하여 계산할 수 있습니다. 참조 된 레드 북을 빠르게 살펴 봤는데 DB2와 같은 기능을 가지고있는 것처럼 보입니다. 그러나 그렇지 않다면 이것은 작동하지 않을 것입니다.

create table TemperatureHistory 
    (City varchar(20) 
    , Temperature decimal(5, 2) 
    , DateTaken datetime) 

insert into TemperatureHistory values ('Minneapolis', 61, '20090101') 
insert into TemperatureHistory values ('Minneapolis', 59, '20090102') 

insert into TemperatureHistory values ('Milwaukee', 65, '20090101') 
insert into TemperatureHistory values ('Milwaukee', 65, '20090102') 
insert into TemperatureHistory values ('Milwaukee', 100, '20090103') 

insert into TemperatureHistory values ('Muskegon', 80, '20090101') 
insert into TemperatureHistory values ('Muskegon', 70, '20090102') 
insert into TemperatureHistory values ('Muskegon', 70, '20090103') 
insert into TemperatureHistory values ('Muskegon', 20, '20090104') 

; with base_t as 
    (select city 
     , Temperature 
     , row_number() over (partition by city order by temperature) as RowNum 
     , (count(*) over (partition by city)) + 1 as CountPlusOne 
    from TemperatureHistory) 
select City 
    , avg(Temperature) as MeanTemp 
    , avg(case 
     when RowNum in (FLOOR(CountPlusOne/2.0), CEILING(CountPlusOne/2.0)) 
      then Temperature 
      else null end) as MedianTemp 
from base_t 
group by City 
+0

나는 이것을 시도 할 것이고, 나는 OLAP을 더 잘 이해할 필요가 있습니다. 감사. – twblamer

+0

나는 이것을 대답으로 정하고있다. DB2 LUW 9.5에서는 카운트 (*)를 사용하지만 불행히도 i는 DB2에서는 작동하지 않습니다. 아무도 아이디어가 없기 때문에이 제한으로 살아야 할 것입니다. 다시 한번 감사드립니다. – twblamer

관련 문제