2014-11-21 2 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; 

EDIT:

Я бы вертеться результаты в самом конце. Что-то вроде этого:

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