sql - 如何访问 Postgres hstore 字段中的数据并从 Active Record 求和

标签 sql postgresql ruby-on-rails-4 activerecord hstore

我有一个 Postgres 9.3.5 数据库,其中有一个名为 order_items 的表。数据布局如下。

 id | product_sku(character var) | qty_ordered(integer) | item_price(hstore)
1   | 9AYSNL                     | 1                    |"Amount"=>"5.99", "CurrencyCode"=>"USD"
2   | 9AYSNL                     | 1                    |"Amount"=>"5.99", "CurrencyCode"=>"USD"
3   | 9AYSNL                     | 2                    |"Amount"=>"11.98", "CurrencyCode"=>"USD"
4   | 9AYSNL                     | 1                    |"Amount"=>"5.99", "CurrencyCode"=>"USD"
5   | EZAY1D                     | 1                    |"Amount"=>"21.98", "CurrencyCode"=>"USD"

我想做的是找出每个 product_sku 在表中出现的频率以及该产品的总“数量”。

如果我运行以下命令,我会得到这个结果。

products =  OrderItem.where('quantity_ordered > 0').group(:product_sku).count

{"9AYSNL"=>4,
"EZAY1D"=>1}

我想以某种方式返回如下内容(total_orders 是 product_sku 在表中的次数,而不是订购的数量)。我想按 total_orders 返回前 20 名。

[{product_sku: "9AYSNL", total_orders: 4, total_order_amount: "29.95"},
 {product_sku: "EZAY1D", total_orders: 1, total_order_amount: "21.98"}]

最佳答案

要获得基本结果:

SELECT product_sku
     , count(*) AS total_orders
     , sum((item_price->'Amount')::numeric) AS total_order_amount
FROM   orderitem
WHERE  qty_ordered > 0
GROUP  BY product_sku
ORDER  BY count(*) DESC
LIMIT  20;  -- get only top 20

要像您显示的那样以 JSON 数组形式获取结果:

SELECT json_agg(t)
FROM  (
   SELECT product_sku
        , count(*) AS total_orders
        , sum((item_price->'Amount')::numeric) AS total_order_amount
   FROM   orderitem
   WHERE  qty_ordered > 0
   GROUP  BY product_sku
   ORDER  BY count(*) DESC
   LIMIT  20
   ) t;

SQL fiddle.

关于sql - 如何访问 Postgres hstore 字段中的数据并从 Active Record 求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072510/

相关文章:

php - 使用PHP连接MySQL

ruby - Thinking Sphinx - 使用 OR 的属性过滤器的多个条件

postgresql - 主机 "0.0.0.0"、用户 "UserName"、数据库 "orders"、SSL 的 Azure Postgres : no pg_hba. conf 条目

postgresql - SQL*Plus 格式化选项的 psql 替代品

ruby - 指定 erb 模板文件编码

ruby-on-rails - 使用 Rails 控制台填充 HABTM 关系中的联接表

sql - PostgreSQL - 显示每个排序组的最后 N 行

sql - 行级触发器与语句级触发器

sql - 当 MariaDB 表看起来没有损坏时,如何解决它可能已损坏的表错误

postgresql - Postgres 初学者层的问题