【问题标题】:Oracle SQL Count orders by customers in the last 10 days based on order idOracle SQL 根据订单 ID 统计客户在过去 10 天内的订单
【发布时间】:2022-02-08 19:14:34
【问题描述】:

在 Oracle SQL 中,我的目标是接收客户在过去 10 天内发出的订单总数,但由订单 ID 而非客户 ID 显示。

给出以下情况:

我想要的结果是:

我怎样才能以最有效的方式促进这一点?

【问题讨论】:

  • 该输出对于给定的数据毫无意义。描述您得出这些数字所遵循的决策逻辑。
  • 基于某个订单id,我想知道一个客户在过去10天内做了多少订单。

标签: sql oracle date group-by count


【解决方案1】:

可以尝试使用带日期减法条件的自联接,条件需要判断10天内有哪些行

查询 1

SELECT t1.Customer_ID,
       t1.Order_NR,
       COUNT(*) Number_Orders
FROM T t1 
INNER JOIN T t2
ON t1.Customer_ID = t2.Customer_ID AND t2.Order_Date BETWEEN t1.Order_Date - 10 AND t1.Order_Date
GROUP BY t1.Customer_ID,
       t1.Order_NR
ORDER BY t1.Order_NR

Results

| CUSTOMER_ID | ORDER_NR | NUMBER_ORDERS |
|-------------|----------|---------------|
|         100 |        1 |             1 |
|         200 |        2 |             1 |
|         300 |        3 |             1 |
|         100 |        4 |             2 |
|         100 |        5 |             2 |
|         200 |        6 |             1 |
|         700 |        7 |             1 |
|         800 |        8 |             2 |
|         800 |        9 |             2 |
|         800 |       10 |             3 |

【讨论】:

  • 太棒了。非常感谢。
  • 但是有一个问题:如果在同一个查询中不仅需要 10 天以上的订单数量,还需要 30 天以上的数量,您将如何更改查询?谢谢
【解决方案2】:

您不需要自联接,只需将COUNT 分析函数与RANGE 窗口一起使用:

SELECT customer_id,
       order_no,
       order_date,
       COUNT(*) OVER (
         PARTITION BY customer_id
         ORDER BY order_date
         RANGE BETWEEN INTERVAL '10' DAY PRECEDING AND INTERVAL '0' DAY FOLLOWING
       ) AS numer_orders
FROM   table_name
ORDER BY order_no

其中,对于样本数据:

CREATE TABLE table_name (customer_id, order_no, order_date) AS
SELECT 100,  1, DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 200,  2, DATE '2021-01-02' FROM DUAL UNION ALL
SELECT 300,  3, DATE '2021-01-05' FROM DUAL UNION ALL
SELECT 100,  4, DATE '2021-01-09' FROM DUAL UNION ALL
SELECT 100,  5, DATE '2021-01-15' FROM DUAL UNION ALL
SELECT 200,  6, DATE '2021-01-18' FROM DUAL UNION ALL
SELECT 700,  7, DATE '2021-01-20' FROM DUAL UNION ALL
SELECT 800,  8, DATE '2021-01-25' FROM DUAL UNION ALL
SELECT 800,  9, DATE '2021-01-25' FROM DUAL UNION ALL
SELECT 800, 10, DATE '2021-01-28' FROM DUAL;

输出:

CUSTOMER_ID ORDER_NO ORDER_DATE NUMER_ORDERS
100 1 01-JAN-21 1
200 2 02-JAN-21 1
300 3 05-JAN-21 1
100 4 09-JAN-21 2
100 5 15-JAN-21 2
200 6 18-JAN-21 1
700 7 20-JAN-21 1
800 8 25-JAN-21 2
800 9 25-JAN-21 2
800 10 28-JAN-21 3

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多