mysql - 如何统计当前订单之前的订单数量

标签 mysql sql group-by aggregate-functions

我有订单表:

| order_id | buyer_id | order_created_at    |
|----------|----------|---------------------|
| 54       | 609      | 2018-08-11 16:46:53 |
| 74       | 363      | 2019-06-01 00:00:00 |
| 75       | 300      | 2019-06-01 00:00:02 |
| 76       | 609      | 2019-06-01 00:00:03 |

我想像这样显示数据:

| order_id | buyer_id | Number_of_orders_plus_this_order |
|----------|----------|----------------------------------|
| 54       | 609      |                                2 |
| 74       | 363      |                                4 |
| 75       | 300      |                                7 |
| 76       | 609      |                                5 |

我尝试了两种方法,第一种:

select t1.order_id, orders.buyer_id, count(1) as Number_of_orders_plus_this_order
from (
 select buyer_id, order_created_at, order_id
 from orders o1
 where o1.order_id in (75, 74, 54,76)
) as t1
join orders on orders.buyer_id = t1.buyer_id
where orders.order_created_at <= t1.order_created_at
group by 1, 2

由于其中一位买家(id:609)显示了两次,并且我按buyer_id分组,这将显示忽略他的订单之一的结果。 像这样:

| order_id | buyer_id | Number_of_orders_plus_this_order |
|----------|----------|----------------------------------|
| 54       | 609      |                                2 |
| 74       | 363      |                                4 |
| 75       | 300      |                                7 |

第二种方法是使用python,我为每个订单创建一个循环并查询数据库。这当然需要很长时间,而且根本不实用。

最佳答案

您可以使用相关子查询来做到这一点:

SELECT order_id, buyer_id, order_created_at, 1 + (
    SELECT COUNT(*)
    FROM orders AS x
    WHERE x.buyer_id = t.buyer_id
    AND (
        x.order_created_at < o.order_created_at OR (
            -- orders having same date need a tie breaker
            x.order_created_at = o.order_created_at
            AND x.order_id < o.order_id
        )
    )
) AS number_of_orders_plus_this_order
FROM orders AS t
WHERE order_id IN (75, 74, 54, 76)

关于mysql - 如何统计当前订单之前的订单数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708518/

相关文章:

php - Doctrine2 和 MySQL 分区

sql - Firebird 在 where 和 order by 子句上的表现

postgresql - GROUP BY 时前两个值的差异

java - 如何在 Java 中检索刚刚添加的数据库表中的行

mysql - 通过命令行访问与 phpmyadmin 不同的数据库

java - 将这个简单的 C# MySQL 代码转换为 Java

sql - 选择整个表格但特定列中的唯一值

sql - IF ELSE语句并插入新列

mysql - 主题先决条件的 SQL 查询

python - 使用 groupby 键作为 pandas dataframe 的索引