SQL查询帮助查找每天的最高订单值
我有两张表,SQL查询帮助查找每天的最高订单值,sql,oracle,oracle-apex-5.1,Sql,Oracle,Oracle Apex 5.1,我有两张表,Customer和Order 在Order表中,我有一个名为date\u time的列,它存储订单的日期和时间。我还有客户ID 我想获取当天价值最高的订单的客户ID 这是检索每天金额最高的订单的查询: SELECT MAX(order_amount) AS "Highest Day Amount", to_char(date_time, 'dd/mm/yyyy') AS "ORDER DATE" FROM orde
Customer
和Order
在Order
表中,我有一个名为date\u time
的列,它存储订单的日期和时间。我还有客户ID
我想获取当天价值最高的订单的客户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');
我需要使用<代码> toyChar < /C> >因为<代码> DATEYTIME/<代码>列包含日期和时间(例如:19/05/2021 17:50),如果我不使用<代码> toyChar < /Cord>,因为我每天有一个以上的命令,因为时间成分,它会考虑日期不同。它将在当天列出两份订单,而不是总数最高的一份订单
然后我想从这些订单中获取客户id,但是我不知道如何做 我想获取当天价值最高的订单的客户ID 您不需要将转换为\u 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(相当详细)实现“第一”聚合功能的方式。您只需将客户IDcto添加到select和group by即可
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
如果您想从客户那里获得更多详细信息,您需要将此表加入到客户表中用您正在使用的数据库标记您的问题。您是一个天才这正是我一直在寻找的,非常感谢