2013-06-06 65 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

可以有2個以上的事件,但現在我只需要關心2個事件。 – Anant

+0

PostgreSQL版本? '解析分析'?請參閱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

簡單(清潔劑):

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語法查詢」更好地工作? – Anant

+1

@安南我猜如果不完全一樣,表現會非常相似。 –