GROUP BY和地图矢量聚合 - Clojure

Ash*_*Ash 9 clojure

我的数据看起来像这样

(def a [{:firmAccount "MSFT" :Val 10  :PE 3 }  
        {:firmAccount "MSFT" :Val 15  :PE 4} 
        {:firmAccount "GOG" :Val 15 :PE 3} 
        {:firmAccount "YAH" :Val 8 :PE 1}])
Run Code Online (Sandbox Code Playgroud)

我想分组:firmAccount,然后将每个公司账户的:和Val和:PE相加,得到类似的结果

 [{:firmAccount "MSFT" :Val 25 :PE 7}
  {:firmAccount "GOG" :Val 15 :PE 3}    
  {:FirmAccount "YAH" :Val 8 :PE 1}]
Run Code Online (Sandbox Code Playgroud)

这真是一件微不足道的事情,在SQL中我甚至不会三思而后行,但是因为我正在学习clojure,请耐心等待

mac*_*mac 8

Clojure.core具有内置的分组功能.由于地图中存在text和int,解决方案变得有点难看.

(for [m (group-by :firmAccount a)]
   (assoc (apply merge-with + (map #(dissoc % :firmAccount) (val m)))
          :firmAccount (key m)))
Run Code Online (Sandbox Code Playgroud)


use*_*049 6

为了完整性,这里是使用map的替代版本:

(map (fn [[firmAccount vals]] 
   {:firmAccount firmAccount 
    :Val (reduce + (map :Val vals)) 
    :PE (reduce + (map :PE vals))}) 
  (group-by :firmAccount a))
Run Code Online (Sandbox Code Playgroud)