首页 > 解决方案 > Activerecord 将具有相同列值的行合并为一个

问题描述

在我的 rails 应用程序中,我正在尝试组合来自多行的数据。

我的表如下所示。

Name    Office   Device
-----   ------   ------- 
USR-A    LA-HQ    MACBOOK
USR-B    LA-HQ    MACBOOK
USR-A    LA-HQ    IMAC
USR-B    NY-HQ    IMAC
USR-B    NY-HQ    IPHONE

我希望数据如下所示

Name    Office   Device
-----   ------   ------- 
USR-A    LA-HQ    MACBOOK, IMAC
USR-B    LA-HQ    MACBOOK
USR-B    NY-HQ    IMAC, IPHONE

标签: sqlrubyactiverecord

解决方案


使用 PostgreSQL 的一个简单方法是使用array_agg

ms = Model.select('"Name", "Office", array_agg("Device") as "Devices"').group(:Name, :Office)

这将为您提供Modelsms并且每个都将有一个额外的Devices方法,该方法将为您提供设备字符串数组。

或者你可以使用string_agg

ms = Model.select('"Name", "Office", string_agg("Device", ',') as "Devices"').group(:Name, :Office)

并且这些Devices方法将为您提供字符串而不是数组。

这些都不保证聚合的任何特定顺序,但如果需要,您可以指定顺序

array_agg("Device" order by "Device")
string_agg("Device", ',' order by "Device" desc)

推荐阅读