2014-11-21 3 views
2

데이터가 양식에서 수집했습니다. 지금 열 필요여러 열 사이의 최대 값을 가진 열 이름 표시

:

COUNTY  | denver | seattle | new_york | dallas | san fran 
-----------+---------+-----------+----------+----------+--------- 
ada  | 3  | 14  | 0  | 0  | 0  
slc  | 10  | 0   | 0  | 0  | 9  
canyon  | 0  | 5   | 0  | 0  | 0  
washington | 0  | 0   | 11  | 0  | 0  
bonner  | 0  | 0   | 0  | 2  | 0 

(cartodb이는 경우 문을 사용하여 수행되었으며, 크로스 탭은 내가 사용하고있는 환경에서 허용되지 않습니다)은 다음과 같습니다 있도록하고 데이터를 "피벗"한 최대 값을 가진 CITY을 나열하십시오. 예 :

COUNTY  | CITY  | denver | seattle | new_york | dallas | san fran 
-----------+----------+---------+-----------+----------+----------+--------- 
ada  | seattle | 3  | 14  | 0  | 0  | 0  
slc  | denver | 10  | 0   | 0  | 0  | 9  
canyon  | seattle | 0  | 5   | 0  | 0  | 0  
washington | new_york | 0  | 0   | 11  | 0  | 0  
bonner  | dallas | 0  | 0   | 0  | 2  | 0 

답장을 보내 주셔서 감사합니다. 이 질문을 하나의 쿼리에서 만들 수 있는지 궁금합니다. 예를 들어, 여기에 데이터를 피벗 할말을 테잎에 나는 위의 첫 번째 테이블의 예에 내 데이터를 얻기 위해 사용되는 쿼리는 다음과 같습니다

SELECT counties.name, counties.state, counties.the_geom, 
count(case when fandom_survey_one.favorite_team = 'Arizona Cardinals' then 'ari' end)          ari, 
count(case when fandom_survey_one.favorite_team = 'Atlanta Falcons' then 'atl' end) atl, 
count(case when fandom_survey_one.favorite_team = 'Baltimore Ravens' then 'bal' end) bal, 
count(case when fandom_survey_one.favorite_team = 'Buffalo Bills' then 'buf' end) buf, 
count(case when fandom_survey_one.favorite_team = 'Carolina 
FROM fandom_survey_one, counties 
WHERE ST_Intersects(fandom_survey_one.the_geom, counties.the_geom) 
group by counties.name, counties.state, counties.the_geom 
order by counties.name, counties.state 

이에 고든 또는 어윈에서 제공하는 답변을 통합 할 수있는 방법이 있는지 궁금 첫 번째 쿼리는이 모든 것을 하나의 쿼리에서 수행 할 수 있습니다. 감사.

+0

첫 번째 결과를 생성하는 데 사용한 쿼리를 게시 할 수 있습니까? – paqogomez

+0

(i) 테이블 위에있는 데이터베이스에서 원래의 (피벗되지 않은) 데이터에 액세스 할 수 있습니까? 테이블 구조는 무엇입니까? (ii) 하나 이상의 도시가 특정 카운티에 대해 최대 가치를 갖는다면 어떤 일이 발생해야합니까? – Abecee

+0

위의 원래 쿼리를 게시했습니다 (이것이 나를 위해 피벗을 생성 한 것입니다). 내 데이터가 왜 내가 피벗 오전 Google 양식에서 오는 것입니다. 동일한 최대 값을 가진 도시가 더 많으면 두 가지를 모두 포함하고자하지만 첫 번째 것을 선택하려고합니다. – user30832

답변

0

당신은 큰 case 문을 사용하여이 작업을 수행 할 수 있습니다

select t.*, 
     (case when denver = greatest(denver, seattle, new_york, dallas, sanfran) then 'denver' 
      when seattle = greatest(denver, seattle, new_york, dallas, sanfran) then 'seattle' 
      when new_york = greatest(denver, seattle, new_york, dallas, sanfran) then 'new_york' 
      when dallas = greatest(denver, seattle, new_york, dallas, sanfran) then 'dallas' 
      when sanfran = greatest(denver, seattle, new_york, dallas, sanfran) then 'sanfran' 
     end) as City     
from table t; 

편집 :

내가 맨 끝에 결과를 돌리 것입니다. 이런 식으로 뭔가 :

SELECT name, state, the_geom, 
     MAX(CASE WHEN seqnum = 1 THEN favorite_team END) as favorite_team, 
     MAX(CASE WHEN favorite_team = 'Arizona Cardinals' THEN cnt ELSE 0 END) as ari, 
     MAX(CASE WHEN favorite_team = 'Atlanta Falcons' THEN cnt ELSE 0 END) as atl, 
     MAX(CASE WHEN favorite_team = 'Baltimore Ravens' THEN cnt ELSE 0 END) as bal, 
     MAX(CASE WHEN favorite_team = 'Buffalo Bills' THEN cnt ELSE 0 END) as buf 
FROM (SELECT c.name, c.state, c.the_geom, s.favorite_team, count(*) as cnt, 
      ROW_NUMBER() OVER (PARTITION BY c.name, c.state, c.the_geom ORDER BY COUNT(*) desc) as seqnum 
     FROM fandom_survey_one s JOIN 
      counties c 
      ON ST_Intersects(s.the_geom, c.the_geom) 
     GROUP BY c.name, c.state, c.the_geom, s.favorite_team 
    ) c 
GROUP BY name, state, the_geom 
ORDER BY name, state 
+0

답장을 보내 주셔서 감사합니다. 이 질문을 하나의 쿼리에서 만들 수 있는지 궁금합니다. 예를 들어 위의 첫 번째 테이블에 데이터를 가져 오기 위해 사용한 쿼리는 다음과 같습니다. – user30832

+0

위 코드를 추가하면이 모든 쿼리를 만들기 위해 제안을 추가 할 수 있습니까? – user30832

3

코드의 반복을 피하기 위해 "simple" or "switched" CASE 문에 대한 교과서적인 예입니다.

SELECT CASE greatest(denver, seattle, new_york, dallas, "san fran") 
      WHEN denver  THEN 'denver' 
      WHEN seattle  THEN 'seattle' 
      WHEN new_york THEN 'new_york' 
      WHEN dallas  THEN 'dallas' 
      WHEN "san fran" THEN 'san fran' 
     END AS city, * 
FROM tbl; 

목록의 첫 번째 항목 (왼쪽에서 오른쪽으로)은 동점 일 때 승리합니다.

+0

위의 첫 번째 코드를 추가하여이 모든 쿼리를 만들기 위해 제안 사항을 추가 할 수 있는지 궁금하십니까? – user30832