如何在ClickHouse中将具有相同列值的mysql行分组为一行?

Posted

技术标签:

【中文标题】如何在ClickHouse中将具有相同列值的mysql行分组为一行?【英文标题】:How to group mysql rows with same column value into one row in ClickHouse? 【发布时间】:2020-06-17 14:06:23 【问题描述】:

我在 ClickHouse 中使用这个查询:

SELECT DISTINCT
  iap.EventId,
  iap.Id as Title,
  ole.RewardId,
  ole.RewardGain,
  if((ole.RewardType = 'Currency' and ole.RewardId = 'Cash'), ole.RewardGain, null) as Soft
FROM OpenLootboxEvent ole 
ANY LEFT OUTER JOIN InAppPurchaseEvent iap
ON ole.EventSourceId = iap.EventId
WHERE iap.Id in ('superHotDeal');

此查询返回结果:

EventId  Title         RewardId  Gain  
---------------------------------------------------------------------
111      superHotDeal  m3        5    
111      superHotDeal  m14       13         
111      superHotDeal  m20       25         
111      superHotDeal  Cash      282            
111      superHotDeal  Talent    null   
111      superHotDeal  Hard      null  

每个“EventId”和“Title”都有6个含义,其中“RewardId”的值可以是“m1”到“m26”,它总是可以有“Cash”、“Talent”、“Hard”值。

如何检索同一行中具有相同“EventId”和“Title”的所有行?

像这样:

EventId  Title         man1  man1Cards   man2  man2Cards   man3  man3Cards  Cash  Talent  Hard                     
----------------------------------------------------------------------------------------------
111      superHotDeal  m3  5             m14   13          m20   25         282   null    null

【问题讨论】:

【参考方案1】:
select EventId, Title, groupArray(tuple(RewardId, RewardGain))
from (
SELECT DISTINCT
  iap.EventId EventId,
  iap.Id as Title,
  ole.RewardId RewardId,
  ole.RewardGain RewardGain,
  if((ole.RewardType = 'Currency' and ole.RewardId = 'Cash'), ole.RewardGain, null) as Soft
FROM OpenLootboxEvent ole 
ANY LEFT OUTER JOIN InAppPurchaseEvent iap
ON ole.EventSourceId = iap.EventId
WHERE iap.Id in ('superHotDeal'))
group by EventId, Title

Pivot In clickhouse

【讨论】:

您好,感谢您的帮助,但此查询返回的结果如下:| 111 |SuperHotDeal | [('m3','5'),('m2','25'),('Cash','282'),('Talent','50')] | 但每个值都需要在单独的列中,如下所示:标题:|EventId | Title | Man1 | Man1Card | Man2 | Man2Card | Man3 | Man3Card | Cash |Talent |Hard。正如我在上面的问题中所展示的那样 然后***.com/questions/62306158/pivot-in-clickhouse 这个选项也不适合,因为请求的结果我没有静态数据,正如我在我的问题中所写的那样。但是 1 EventId 的结果始终是 6 个值 SQL 定义查询结果中的列数在查询执行之前是已知的。 @N.Ayaz 因为你的定义无法解决。

以上是关于如何在ClickHouse中将具有相同列值的mysql行分组为一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MySql中返回具有相同列值的行

如何将具有相同列值的mysql行分组为一行?

连接具有相同值的行的列值(不同列的)

ClickHouse:从同列名的select中访问源列

如何查看具有实际列值的数据透视表,例如在 excel 中的访问

计算具有与相同 ID 相关的不同列值的结果