嵌套选择使用count来计算Postgres中的每一行

时间:2014-08-29 22:45:05

标签: postgresql select count subquery

我有一个表,其中每一行都是一个唯一的订单,具有唯一的order_id,但用户可以拥有多行/订单。

订单表 - > order_id,user_id,orderedat(datetime),sales

我正在尝试返回一个查询,该查询为每个order_id计算关联用户已经完成的先前订单数量。 (基本上,这一行是否代表用户的第一个订单?第五个订单?第二个订单?等等)

我正在尝试类似这种嵌套选择的方法,但是我收到错误"用作表达式的子查询返回了多行。"

SELECT
  order_id,
  user_id,
  COUNT (order_id) AS order_n
FROM
  orders
WHERE orderedat >= (
  SELECT
    orderedat
  FROM
    fulfillments
  GROUP BY
    order_id
)
GROUP BY
  order_id

关于如何在postgres中实现这一点的任何想法?

/////////////// 进一步的复杂化:另一个名为" Status,"如何只计算状态中具有特定值的行?我想跳过号码中的订单,除非他们的状态为“已付款”#34;或者"放置"。例如:

data:
order_id      user_id      orderedat      status
001            max          10/1/14        paid
002            max          10/20/14       placed
003            max          10/21/14       cancelled
004            bill         10/5/14        deleted
005            max          10/31/14       paid
006            bill         10/24/14       placed

results:
order_id      user_id      orderedat      orders_so_far
001            max          10/1/14        1
002            max          10/20/14       2
003            max          10/21/14       null
005            max          10/31/14       3
004            bill         10/5/14        null
006            bill         10/24/14       1

1 个答案:

答案 0 :(得分:4)

这可以使用窗口函数来完成:

SELECT order_id,
       user_id,
       orderdat,
       row_number() over (partition by user_id order by orderedat ) as orders_so_far
FROM orders
order by user_id, orderdat