我有一个 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 - 如何访问 Postgres hstore 字段中的数据并从 Active Record 求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072510/