SQL 查询帮助查找每天的最高订单价值

SQL Query Help Finding Highest Order Value From Each Day

我有两个 table,CustomerOrder

Order table 中,我有一个名为 date_time 的列,用于存储订单的日期和时间。我还有 CustomerID.

我想获取当天价值最高的订单的客户 ID。

这是检索每天金额最高的订单的查询:

SELECT 
    MAX(order_amount) AS "Highest Day Amount", 
    to_char(date_time, 'dd/mm/yyyy') AS "ORDER DATE"
FROM 
    orders
GROUP BY 
    to_char(date_time, 'dd/mm/yyyy');

我需要使用 to_char,因为 date_time 列同时包含日期和时间(例如:19/05/2021 17:50),如果我不使用to_char 因为我每天有不止一个订单,它会认为日期不同,因为时间成分,它会列出当天的两个订单,而不是总计最高的 1 个订单。

然后我想从这些订单中获取客户 ID,但我不确定该怎么做。

I want to get the customers ID for the orders with the highest value from that day.

您不需要 to_char(),但截断日期的方式取决于数据库。关键思想是您要使用 window 函数:

SELECT o.*
FROM (SELECT o.*,
             ROW_NUMBER() OVER (PARTITION BY to_char(date_time, 'YYYY-MM-DD') ORDER BY order_amount DESC) as seqnum
      FROM orders o
     ) o
WHERE seqnum = 1;

本returns整行订单金额最高。您可以根据需要格式化结果集。

在 Oracle 中,您可以使用聚合来完成此操作。我会推荐:

select trunc(date_time), max(order_amount),
       max(customer_id) keep (dense_rank first order by order_amount desc) as customer_id
from orders o
group by trunc(date_time);

keep 语法是 Oracle 实现“第一个”聚合函数的(相当冗长的)方式。

您只需将客户 IDc 添加到 select 和分组

SELECT MAX(order_amount) as "Highest Day Amount", to_char(date_time, 'dd/mm/yyyy') AS "ORDER DATE", customerID
 FROM orders GROUP BY to_char(date_time, 'dd/mm/yyyy'), customerID

如果您想从客户那里获得更多详细信息,您需要加入此 table 给客户 table