【问题标题】:SQL Query Help Finding Highest Order Value From Each DaySQL 查询帮助查找每天的最高订单值
【发布时间】:2021-05-19 11:28:01
【问题描述】:

我有两张桌子,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),如果我不使用to_char,因为我有更多如果不是每天一个订单,它会认为日期是不同的,因为时间部分,它会列出当天的两个订单,而不是一个总数最高的订单。

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

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql oracle oracle-apex-5.1


【解决方案1】:

我想获取当天价值最高的订单的客户 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 实现“第一个”聚合函数的(相当冗长的)方式。

【讨论】:

  • 你是个天才,这正是我一直在寻找的东西,非常感谢
【解决方案2】:

您只需将您的客户 IDc 添加到 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

如果您想从客户那里获得更多详细信息,您需要将此表加入到客户表中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多