2017-11-15 3 views
1

임팔라에서 일하고 있는데 임팔라와 SQL 모두에서 매우 익숙하지는 않지만 외모가있는 데이터 세트를 만들 수 있어야합니다.임펄스 SQL 행 데이터를 기반으로 행을 만들고 행 데이터를 추가하여 열 채우기

임팔라의 제약으로 인해 정상적인 상황에서 원하는 결과를 얻을 수없는 피벗을 사용할 수 없습니다. 다음 데이터를

select 
dayname(date) as dayname, 
utc_hour, 
sum(case when (`type` IN ('Awesome')) then 1 else 0 end) as some 
FROM (select *, trunc(cast(floor(date/1000) as timestamp), "HH") as utc_hour 
FROM COOLNESSTYPES 
WHERE date >= 1510082633596 and month >= '2017-11' 
)  a 
GROUP BY utc_hour, dayname 
ORDER BY utc_hour; 

을 반환합니다 :

는 지금까지,이처럼 보이는 SQL SELECT 문이

그래서
+-----------+---------------------+-------+ 
| dayname   | utc_hour   | some | 
+-----------+---------------------+-------+ 
| Wednesday | 2017-11-08 00:00:00 | 20 | 
| Wednesday | 2017-11-08 01:00:00 | 11 | 
| Wednesday | 2017-11-08 09:00:00 | 1  | 
| Wednesday | 2017-11-08 11:00:00 | 40 | 
| Wednesday | 2017-11-08 12:00:00 | 0  | 
| Wednesday | 2017-11-08 13:00:00 | 6  | 
| Wednesday | 2017-11-08 14:00:00 | 0  | 
| Wednesday | 2017-11-08 16:00:00 | 2  | 
| Wednesday | 2017-11-08 17:00:00 | 10 | 
| Wednesday | 2017-11-08 19:00:00 | 5  | 
| Thursday | 2017-11-09 07:00:00 | 1  | 
| Thursday | 2017-11-09 12:00:00 | 0  | 
| Thursday | 2017-11-09 13:00:00 | 0  | 
| Thursday | 2017-11-09 14:00:00 | 58 | 
| Friday | 2017-11-10 09:00:00 | 0  | 
| Friday | 2017-11-10 10:00:00 | 0  | 
| Friday | 2017-11-10 16:00:00 | 0  | 
+-----------+---------------------+-------+ 

, 내가 이런 일을 가야합니까 어떻게? Cloudera의 커뮤니티 페이지에서 누군가가 조합을 사용하도록 권장하고 있지만 필자의 열을 utc_hour 열의 행 값으로 레이블하는 방법에 대해서는 분명하지 않습니다. (필요한 경우 노조 제안에 대한 자세한 내용은 https://community.cloudera.com/t5/Interactive-Short-cycle-SQL/Transpose-columns-to-rows/td-p/49667을 참조하십시오.)

이 문제에 대한 도움이나 아이디어는 크게 감사하겠습니다. 감사!

답변

1

정말로 변경되는 열 이름이 필요하면 복잡성이 더해집니다. 당신이 고정 된 열 이름을 허용 할 수있는 경우 피벗는이 라인을 따라, 간단하다

select 
     dayname 
    , extract(dow from utc_hour) d_of_w 
    , max(case when date_part('day', utc_hour) = 0 then somecol end) hour_0 
    , max(case when date_part('day', utc_hour) = 7 then somecol end) hour_7 
    , max(case when date_part('day', utc_hour) = 9 then somecol end) hour_9 
    , max(case when date_part('day', utc_hour) = 12 then somecol end) hour_12 
    , max(case when date_part('day', utc_hour) = 14 then somecol end) hour_14 
from COOLNESSTYPES 
group by 
     d_of_w 
    , dayname 

내가 extract(hour from utc_hour)를 사용하여이 예를 대신 지금 (감사 hbomb합니다) 위의 date_part() 내 예를 개발하는 포스트 그레스를 사용했습니다.

| dayname | d_of_w | hour_0 | hour_7 | hour_9 | hour_12 | hour_14 | 
|-----------|--------|--------|--------|--------|---------|---------| 
| Wednesday |  3 |  20 | (null) |  1 |  0 |  0 | 
| Friday |  5 | (null) | (null) |  0 | (null) | (null) | 
| Thursday |  4 | (null) |  1 | (null) |  0 |  58 | 

참조 : http://sqlfiddle.com/#!17/81cfd/2 (포스트 그레스)

것은 당신이 "동적 SQL"을 필요로 변경 열 이름을 달성하기하고 이것이 내가 돈으로 (임팔라에서 가능한 경우로 명확하지 않다 솔직한로 해당 제품을 사용하지 마십시오).

+1

이것은 정확히 내가 필요한 것입니다. 초기 SQL (또는 그로부터 파생 된 것)을 공통 테이블 표현식으로 설정 한 다음 위에서 언급 한 것을 구현할 수있었습니다. 유일한 다른 gotcha는 EXTRACT에있었습니다 - 임팔라에서는 EXTRACT 대신 date_part ('day', utc_hour)를 사용하여 동일한 결과를 얻습니다. 다시 한 번 감사드립니다! – hbomb

+0

의견을 보내 주셔서 감사합니다. 나는 date_part() 문법이 더 두드러 지도록 질문에 추가 할 것이다. –

+0

dayofweek (utc_hour)은 Impala 날짜 시간 함수 라이브러리 인 FWIW에서 사용할 수있는 더 나은 함수 옵션입니다 – hbomb