postgres - 获得客户购买的顶级类别

时间:2015-08-04 23:40:02

标签: postgresql

我有一个带有列的非规范化表:

buyer_id
order_id
item_id
item_price
item_category

我想返回每个buyer_id返回1行的内容

buyer_id, sum(item_price), item_category

- 但仅限于具有该特定buyer_id的销售额最高的类别。

我无法使row_number()或分区正常工作,因为我需要通过item_price相对于item_category相对于买方的总和进行排序。我忽略了什么明显的东西吗?

1 个答案:

答案 0 :(得分:0)

这里需要几层捏造:

SELECT buyer_id, item_sum, item_category
FROM (
  SELECT buyer_id,
         rank() OVER (PARTITION BY buyer_id ORDER BY item_sum DESC) AS rnk,
         item_sum, item_category
  FROM (
    SELECT buyer_id, sum(item_price) AS item_sum, item_category
    FROM my_table
    GROUP BY 1, 3) AS sub2) AS sub
WHERE rnk = 1;

sub2中,您计算​​了' item_price'的总和。对于每个" item_category'对于每个'buyer_id'。在sub中,您可以通过' buyer_id'对这些窗口功能进行排名,按照项目顺序排序'按降序排列(所以最高的' item_sum'首先出现)。在主查询中,选择rnk = 1

的行