考虑下表:
User | Device -------+----------- User 1 | Device 1 User 2 | Device 2 User 3 | Device 1 User 4 | Device 3
在本例中,如何在单独的列中获取每个设备1的用户?
Device 1 | User 1 | User 3 Device 2 | User 2 | Device 3 | User 4 |
每个设备可以有多于2个用户;实际上最大值是未知的
wwwo4jvm1#
你可以用 row_number() 和条件聚合:
row_number()
select device, max(case when rn = 1 then user end) user1, max(case when rn = 2 then user end) user2, ... from ( select t.*, row_number() over(partition by device order by user) rn from mtable t ) t group by device order by device
您可以扩展 select 根据需要使用更多条件表达式的子句。当给定设备的用户排气时,将显示以下列 null 价值观。
select
null
tzcvj98z2#
将数据拼接成单独的列是很棘手的——除非您知道最大用户数。通常对于这种类型的问题,最简单的解决方案是通过串联字符串将值放入单个列中。确切的语法取决于数据库,但sql标准语法是:
select device, listagg(user, ',') within group (order by user) as users from t group by device;
2条答案
按热度按时间wwwo4jvm1#
你可以用
row_number()
和条件聚合:您可以扩展
select
根据需要使用更多条件表达式的子句。当给定设备的用户排气时,将显示以下列null
价值观。tzcvj98z2#
将数据拼接成单独的列是很棘手的——除非您知道最大用户数。
通常对于这种类型的问题,最简单的解决方案是通过串联字符串将值放入单个列中。确切的语法取决于数据库,但sql标准语法是: