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

问题描述

我有两个表,CustomerOrder

Order 表中,有一个名为 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),如果我不使用 {{1 }} 因为我每天有一个以上的订单,它会认为日期不同,因为时间组件,它会列出当天的两个订单,而不是总数最高的1个订单。

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

解决方法

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

您不应该需要 to_char(),但如何截断日期取决于数据库。关键思想是你要使用窗口函数:

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;

这将返回具有最高订单金额的整行。您可以根据需要格式化结果集。

在 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 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

如果您想了解客户的更多详细信息,则需要将此表加入到客户表中