我有来自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
提前致谢!
答案 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