2015-08-03 2 views
2

У меня следующая таблица в «С»:POSTGRESQL - подсчет количество в виртуальной таблице

"A" ---- 1 ---- 313 
"B" ---- 1 ---- 8 
"C" ---- 1 ---- 234 

"A" ---- 2 ---- 373 
"B" ---- 2 ---- 500 
"C" ---- 2 ---- 15 

мне нужно найти переменный (A/B/C) в каждой группе (1/2) с самый большой подсчет.

То есть, для группы 1, переменная A. Для группы 2, переменная B. Таким образом, новая таблица Я хочу, чтобы иметь возможность сделать из него такой:

"A" -- 1 
"B" -- 1 
"C" -- 0 
+0

, что делает '- 'и' 0' в вашем выпуске? –

+0

- это счет того, сколько раз переменная (например, A) имела наивысший счет в определенной группе (1/2). Вы можете видеть, что у «C» никогда не было наибольшего количества в любой группе, поэтому оно равно 0. – BVtp

+0

Пожалуйста, покажите полный текущий запрос –

ответ

0
with x as 
(select row_number() over(partition by groupid order by value desc) as rn, 
* from tablename) 
select t.var, sum(case when t.var = 'A' and y.rn = 1 then 1 
        when t.var = 'B'and y.rn = 1 then 1 
        when t.var = 'C' and y.rn = 1 then 1 
        else 0 end) as cnt 
from tablename t left join y 
on y.var = t.var and y.groupid = t.groupid 
group by t.var 

С помощью row_number() выберите максимальное значение для каждой группы и затем суммируйте его.

+0

Спасибо. Прошу прощения, мне трудно понять, как интегрировать его с моей таблицей. В таблице я описал уже в WITH: 'с (нм, бл, тх), как \t (выберите PNAME, ballotBox.bno, MAX (nofvotes) \t ..... \t)' – BVtp

+0

Вы можете добавьте это как следующий cte, а затем выберите то, что вам нужно в конце. например, с помощью (select ...), b as (...) select .. from join b ... ' –

+0

Не уверен, что я понимаю, что вы имеете в виду – BVtp

0

Есть две проблемы, происходящие здесь:

  1. для каждой группы, найти, какая переменная имела наибольшее количество
  2. подсчитать, сколько раз каждая переменная имеет наибольшее количество

способ решить это - решить каждую из проблем индивидуально. Для 1, вы можете использовать раствор, полученный из this answer:

SELECT t1.* 
FROM mytable t1 
    LEFT OUTER JOIN mytable t2 
    ON (t1.groupid = t2.groupid AND t1.countnum < t2.countnum) 

Комбинируя выше вызов с распечаткой эпизодов результатов переменных в следующем вызове:

SELECT variable, count(variable) FROM (
    SELECT t1.* 
    FROM mytable t1 
    LEFT OUTER JOIN mytable t2 
     ON (t1.groupid = t2.groupid AND t1.countnum < t2.countnum) 
) AS counts 
GROUP BY variable; 
+0

В вашем первом запросе отсутствует бит, который отфильтровывает все строки, которые вы не хотите. В вашем втором запросе отсутствует то же самое, плюс (после исправления) он не будет содержать строки, где счетчик равен нулю. – ruakh

Смежные вопросы