【问题标题】:nested select using count to tally each row in Postgres嵌套选择使用计数来计算 Postgres 中的每一行
【发布时间】:2014-11-05 08:00:10
【问题描述】:

我有一个表,其中每一行都是具有唯一 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 中实现这一点有什么想法吗?

////////////// 更复杂的情况:使用另一个名为“状态”的列,如何只计算状态中具有特定值的行?我只想跳过号码中的订单,除非它们的状态为“已付款”或“已下单”。例如:

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

【问题讨论】:

    标签: postgresql select count subquery


    【解决方案1】:

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

    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
    

    【讨论】:

    • 一个额外的复杂情况:如果我在表中有另一个字段,称为状态('已付款''已退款''已放置''已删除),有没有办法让这个查询排除某些状态?例如,如果我想运行此计数,但对于 Status = 'deleted' 的所有订单,它们不应计入总计数。我不确定这是否可能,因为它使用 row_number(),但也许如果我添加 'WHERE Status 'deleted'?
    • @ebmoore:您是想从结果中完全排除这些行,还是这些行根本没有行号,或者这些行是否只具有“前一个”行的行号?请向您的问题添加一些示例数据和预期输出,以显示您想要的内容。
    • 对我的长时间延误表示歉意——我想跳过编号中的那些订单。例如: order_id user_id orderedat 状态 001 最多 10/1/14 已付款 002 最多 10/20/14 已放置 003 最多 10/21/14 已取消 004 账单 10/5/14 已删除 005 最多 10/31/14 已付款 006 账单 10 /24/14 放置结果:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2021-03-10
    • 2022-12-07
    • 2014-03-18
    • 2019-06-17
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多