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 

有人可以建议我找出更好和优化的查询吗?,或者我正在遵循一个好的方法。

4

3 回答 3

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 只遍历表一次,为您提供总数,与您要计算的事件数无关:当您的行数很高时,您将观察到原始查询的显着延迟。我应该将此添加到我的答案中,您认为

于 2013-06-06T09:53:13.950 回答
1

比 case 语法更简单(更简洁):

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
于 2013-06-06T11:24:02.883 回答
0

您正在 sql 中寻找PIVOT 和 UNPIVOT检查下面的示例非常方便

http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/

于 2013-06-06T10:22:22.143 回答