2016-11-11 4 views
1

У меня есть следующие таблицы базы данных VerticaSQL: Получить счетчик частоты, подобный поворот таблицы

+---------+-------+ 
| ReadOut | Event | 
+---------+-------+ 
|  1 | A  | 
|  1 | A  | 
|  1 | B  | 
|  1 | B  | 
|  2 | A  | 
|  2 | B  | 
|  2 | B  | 
+---------+-------+ 

Я пытаюсь получить частоту каждого события в зачитывает. Может быть, я missusing термин «частота» в этом случае, но в идеале в конце я бы таблицу, как это:

+-----------+---------+---------+--+ 
| Frequency | Event_A | Event_B | | 
+-----------+---------+---------+--+ 
| 1   |  1 |  0 | | 
| 2   |  1 |  2 | | 
| 3   |  0 |  0 | | 
| 4   |  0 |  0 | | 
| .   |  0 |  0 | | 
| .   |  0 |  0 | | 
| .   |  0 |  0 | | 
+-----------+---------+---------+--+ 

До сих пор я реализовал цикл в питона, который выглядит, как это (упрощенный вариант) :

# get all the available event names 
Eventlist=SELECT DISTINCT Event FROM table 
# loop over each event to get the frequency 
for ii in Eventlist: 
    SELECT count(Readout) FROM table WHERE Event = ii group by Readout 

Но disadvante в том, что мне нужно знать имена событий заранее, который требует отдельного запроса, и я должен запустить кучу петель. Есть ли более элегантный способ сделать это. Thanks Mates

+0

Вам не хватает колонки последовательности/времени –

+0

@DuduMarkovitz Можете ли вы подробнее рассказать немного? – valenzio

+0

Извините, мой плохой ......... –

ответ

1

Vertica не имеет возможности поворачивать. Вам нужно будет сгенерировать sql для поворота или просто в python. Я бы просто сделал это на python, попробуйте простой запрос.

Что касается получения отсчетов в случае, вы можете сделать все это в одно время:

with f as (
    SELECT readout, event, COUNT(*) frequency 
    FROM mytable 
    GROUP BY 1, 2 
) 
select frequency, event, count(*) cnt 
from f 
group by 1, 2 
order by 1, 2 

Затем с помощью питона поворота и заполнить пробелы частот, если вам нужно. (Если вы используете панды, поворот, вероятно, будет простым).

Вот пример поворота к Dict (зависит от того, импровизировать вы используете и настройки для подключения, так что вам, возможно, потребуется изменить его):

from collections import defaultdict 

myresult = defaultdict(dict) 
for row in rows: 
    myresult[row['frequency'][row['event']] = row['cnt'] 

Я уверен, что есть еще более умный способ сделать это с пониманием dict, но это кажется простым.

Надеюсь, это поможет.

+0

Это очень помогает. Большое спасибо! – valenzio

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

  • Нет связанных вопросов^_^