很抱歉,如果有人问这个问题,请稍微搜索一下并且找不到我喜欢的东西,但如果有的话请链接。
我正在使用Oracle并尝试在不使用临时表的情况下在多个表中的多个列中聚合结果。示例如下:
Table: USERS
--------------
ID | USER_NAME
--------------
1 | Bob
2 | Joe
3 | Mary
Table: PROJECT_USERS
----------------------------------
USER_ID | PROJECT_ID | ACCESS_TYPE
----------------------------------
1 |123 |8
1 |456 |9
1 |789 |10
2 |123 |10
2 |456 |9
2 |789 |8
3 |123 |9
3 |456 |10
3 |789 |10
我已经能够使用LISTAGG取得一些成功,例如使用以下查询查找特定项目输出中的用户:
SELECT
LISTAGG(users.user_name, ',') WITHIN GROUP (ORDER BY users.user_name)
FROM
users,
project_users
WHERE
project_users.user_id = users.id
AND project_users.project_id = 123
GROUP BY ID
;
(道歉,如果上面的语法稍微偏离,因为原因模糊了实际的结构和数据,所以这不是我正在使用的确切查询) 哪个会输出:
Bob,Joe,Mary
但我想要输出的是USERS.USER_NAME和PROJECT_USERS.ACCESS_TYPE的组合,它们以类似的格式汇总,也许两个值用 - 分隔 -
Bob-8,Joe-10,Mary-9
我可以获得个人回报
SELECT users.user_name || '-' || project_users.access_type...
返回
Bob-8
Joe-9
Mary-10
并希望我能够将这些结果列入LISTAGG,但遗憾的是无法让它发挥作用。如前所述,临时表是正确的,因为我不想进入,但我相信这会让事情变得更容易。使用FROM中的SELECT不起作用,我不认为,因为最后我希望能够在子查询中使用它,而我的理解(以及尝试它的经验有限)是它不能正确迭代每一次通过。也许我错了,但是做错了。
有什么建议吗?
谢谢!
答案 0 :(得分:0)
看来你想要这样的东西。不知道为什么你想要它(在这种情况下),但它说明了你问的方法。
arr = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': nil, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}]
arr.flat_map(&:to_a).group_by(&:first).each_with_object({}) { |(k,v),h|
h[k] = v.map(&:last).compact }
#=> {:a=>[1, 4, 7], :b=>[2, 8], :c=>[3, 6, 9]}