2013-06-06 2 views
1

У меня есть такой стол.Как я могу оптимизировать нижеследующий запрос?

_id (integer) 
event_name(varchar(20)) 
event_date(timestamp) 

Вот несколько примеров данных, приведенных ниже.


ID   event_date       event_name 
101  2013-04-24 18:33:37.694818   event_A 
102  2013-04-24 20:34:37.000000   event_B 
103  2013-04-24 20:40:37.000000   event_A 
104  2013-04-25 01:00:00.694818   event_B 
105  2013-04-25 12:00:15.694818   event_A 

мне нужны данные из приведенных выше таблиц в формате ниже.

Date   count_eventA      count_eventB 
2013-04-24 2         1 
2013-04-25 1         1 

следовательно, в основном необходимо количество каждого события на каждую дату.

Я попытался выполнить запрос для получения желаемого результата.

SELECT A.date1 AS Date , 
     A.count1 AS count_eventA, 
     B.count2 AS count_eventB, 
      FROM 
      (SELECT count(event_name)AS count1, 
      event_date::date AS date1 
      FROM tblname 
      WHERE event_name='event_A' 
      GROUP BY (event_date::date))AS A 
      LEFT JOIN 
      (SELECT count(event_name)AS count1, 
      event_date::date AS date1 
      FROM tblname 
      WHERE event_name='event_B' 
      GROUP BY (event_date::date))AS B ON A.date1=B.date2 

Может кто-нибудь предложить мне найти лучший и оптимизированный запрос? , или я следую хорошему подходу.

+0

будет только два события? –

+0

Здесь может быть более двух событий, но сейчас мне нужно заботиться только о двух событиях. – Anant

+0

PostgreSQL версия? 'EXPLAIN ANALYZE'? См. Http://stackoverflow.com/tags/postgresql-performance/info –

ответ

3

Что-то на этой линии должны работать:

select event_date::date AS Date , 
     count_eventA = sum(case when event_name = 'event_A' then 1 else 0 end), 
    count_eventB = sum(case when event_name = 'event_B' then 1 else 0 end) 
from tblname 
GROUP BY (event_date::date)) 

Если у вас есть больше событий, нужно только добавить больше sum(case) линии :)

DBEngine работает только через таблицу один раз, чтобы дать вам итоговые , независимо от количества событий, которые вы хотите подсчитать: когда у вас есть высокий номер строки, вы будете наблюдать значительную задержку с исходным запросом. Должен ли я добавить это мой ответ, вы думаете

+0

не могли бы вы объяснить немного больше, как это будет лучшим подходом? – Anant

+0

DBEngine только один раз проходит через таблицу, чтобы дать вам итоговые значения, независимо от количества событий, которые вы хотите подсчитать: когда у вас есть высокий ряд строк, вы будете наблюдать значительную задержку с исходным запросом. Должен ли я добавить это к моему ответу, вы думаете? – Zelloss

+1

спасибо @Zelloss .. за хороший ответ !! и да, было бы лучше, если бы вы добавили вышеприведенное описание в ответы. – Anant

1

Simpler (и чище), чем в случае синтаксис:

select 
    event_date::date as Date, 
    count(event_name = 'event_A' or null) count_eventA, 
    count(event_name = 'event_B' or null) count_eventB 
from t 
group by 1 
+0

спасибо за ответ.Не могли бы вы объяснить в своем ответе, когда дело касается производительности, как выше запрос работает лучше, чем «CASE Syntax query»? – Anant

+1

@Anant Я думаю, что производительность будет очень похожа, если не совсем то же самое. –

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