来自不同行的两个事件要合并为一个

时间:2017-09-15 15:31:10

标签: sql sql-server

我有来自Mixpanel的数据,有两个不同的事件,具有相同的distinct_id。然后将该数据提取到列中。

需要在SQL中旋转数据以在同一行上显示两个事件的输出。

数据示例:

| distinct_id | event | output_event1 | output_event2 |  
|-------------|-------|---------------|---------------|  
| 78          | event1| output1       | NULL          |  
| 78          | event2| NULL          | output2       |  

期望的输出:

| distinct_id | output_event1 | output_event2 |  
|-------------|---------------|---------------|  
| 78          | output1       | output2       |   

我到目前为止尝试过的查询尝试了两个with子句,但效率很低,我希望在更多列中显示来自同一个表的更多信息。此版本查询的另一个限制是它显示的ID不是event1的事件输出,但可以使用子查询进行修复...我认为这将进一步降低效率并且正在寻求帮助。

with event1 as (
                select max(e.id) as id, e.event1, e.distinct_id -- multiple events are possible, select most recent one
                from mixpanel.events e where event='event1' 
                group by event, distinct_id)
, event2 as (
                select e.id, e.event, e.distinct_id, e.event2
                from mixpanel.events e where event='event2')
select s.distinct_id, s.id, f.id, f.event2 
from event1 s 
left join event2 f on s.distinct_id=f.distinct_id

提前致谢!

2 个答案:

答案 0 :(得分:1)

为什么不删除子查询并在主查询中使用聚合?

select
   distinct_id
   ,output_event1 = max(output_event1)
   ,output_event2 = max(output_event2)
from
   yourTable
group by
   distinct_id

答案 1 :(得分:1)

如果您在event中有其他事件类型,或者由于某种原因无法使用简单的max();

使用条件聚合:

select 
    distinct_id
  , output_event1 = max(case when event='event1' then event1 end)
  , output_event2 = max(case when event='event2' then event2 end)
from mixpanel.events
group by distinct_id
相关问题