SQL 查询帮助查找每天的最高订单价值
SQL Query Help Finding Highest Order Value From Each Day
我有两个 table,Customer
和 Order
。
在 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
我有两个 table,Customer
和 Order
。
在 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