Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于分组方式的SQL问题_Sql - Fatal编程技术网

关于分组方式的SQL问题

关于分组方式的SQL问题,sql,Sql,我已经使用SQL好几年了,这种类型的问题不时出现,我还没有找到答案。但也许我找错地方了——我真的不知道该怎么称呼它 为了简洁起见,假设我有一个包含3列的表:Customer、Order\u Amount、Order\u Date。每个客户可能有多个订单,每个订单一行显示金额和日期 我的问题:在SQL中有没有一种简单的方法来获取每个客户的最大订单日期 我可以通过执行以下操作获得每个客户的最大订单量以及哪个客户下的订单: SELECT Customer, MAX(Order_Amount) FROM

我已经使用SQL好几年了,这种类型的问题不时出现,我还没有找到答案。但也许我找错地方了——我真的不知道该怎么称呼它

为了简洁起见,假设我有一个包含3列的表:Customer、Order\u Amount、Order\u Date。每个客户可能有多个订单,每个订单一行显示金额和日期

我的问题:在SQL中有没有一种简单的方法来获取每个客户的最大订单日期

我可以通过执行以下操作获得每个客户的最大订单量以及哪个客户下的订单:

SELECT Customer, MAX(Order_Amount) FROM orders GROUP BY Customer;

但我还想得到最大订单的日期,我还没有找到一个容易得到的方法。我本以为这是数据库的常见问题,因此在SQL中很容易做到,但我还没有找到一种简单的方法来做到这一点。一旦我将Order_Date添加到要选择的列列表中,我需要将其添加到Group By子句中,我认为这不会满足我的需要。

没有捷径。。。最简单的方法可能是连接到子查询:

SELECT
    *
FROM
    orders JOIN
    (
        SELECT Customer, MAX(Order_Amount) AS Max_Order_Amount
        FROM orders 
        GROUP BY Customer
    ) maxOrder 
        ON maxOrder.Customer = orders.Customer 
        AND maxOrder.Max_Order_Amount = orders.Order_Amount

没有捷径。。。最简单的方法可能是连接到子查询:

SELECT
    *
FROM
    orders JOIN
    (
        SELECT Customer, MAX(Order_Amount) AS Max_Order_Amount
        FROM orders 
        GROUP BY Customer
    ) maxOrder 
        ON maxOrder.Customer = orders.Customer 
        AND maxOrder.Max_Order_Amount = orders.Order_Amount

您将要加入到同一个表中

SELECT Customer, order_date, amt 
FROM orders o,
    ( SELECT Customer, MAX(Order_Amount) amt FROM orders GROUP BY Customer ) o2
WHERE o.customer = o2.customer
AND o.order_amount = o2.amt
;

您将要加入到同一个表中

SELECT Customer, order_date, amt 
FROM orders o,
    ( SELECT Customer, MAX(Order_Amount) amt FROM orders GROUP BY Customer ) o2
WHERE o.customer = o2.customer
AND o.order_amount = o2.amt
;

除了自动加入外,您还可以执行以下操作:

SELECT o1.*
FROM orders o1 JOIN orders o2 ON o1.Customer = o2.Customer
GROUP BY o1.Customer, o1.Order_Amount
HAVING o1.Order_Amount = MAX(o2.Order_Amount);
有一个很好的方法来回顾各种方法

在Oracle、db2、Sybase和SQLServer2005+中,您将使用


注:如果客户有多个订单,订单金额最大,即领带,则使用排名功能将获得所有此类订单;若要仅获取第一个,请将排名替换为行号。

除了自动加入之外,您还可以执行以下操作:

SELECT o1.*
FROM orders o1 JOIN orders o2 ON o1.Customer = o2.Customer
GROUP BY o1.Customer, o1.Order_Amount
HAVING o1.Order_Amount = MAX(o2.Order_Amount);
有一个很好的方法来回顾各种方法

在Oracle、db2、Sybase和SQLServer2005+中,您将使用


注:如果客户有多个订单,订单金额最大,即领带,则使用排名功能将获得所有此类订单;若要仅获取第一个,请将排名替换为行编号。

您可以尝试以下方法:

SELECT Customer, MAX(Order_Amount), Order_Date 
FROM orders  O
WHERE ORDER_AMOUNT = (SELECT MAX(ORDER_AMOUNT) FROM orders WHERE CUSTOMER = O.CUSTOMER)
GROUP BY CUSTOMER, Order_Date 

您可以尝试以下方法:

SELECT Customer, MAX(Order_Amount), Order_Date 
FROM orders  O
WHERE ORDER_AMOUNT = (SELECT MAX(ORDER_AMOUNT) FROM orders WHERE CUSTOMER = O.CUSTOMER)
GROUP BY CUSTOMER, Order_Date 

另一种收集方法:

WITH tempquery AS 
(
    SELECT 
         Customer
        ,Order_Amount
        ,Order_Date
        ,row_number() OVER (PARTITION BY Customer ORDER BY Order_Amount DESC) AS rn
    FROM 
        orders 
)
SELECT 
     Customer
    ,Order_Amount
    ,Order_Date
FROM
    tempquery
WHERE
    rn = 1

另一种收集方法:

WITH tempquery AS 
(
    SELECT 
         Customer
        ,Order_Amount
        ,Order_Date
        ,row_number() OVER (PARTITION BY Customer ORDER BY Order_Amount DESC) AS rn
    FROM 
        orders 
)
SELECT 
     Customer
    ,Order_Amount
    ,Order_Date
FROM
    tempquery
WHERE
    rn = 1

如果您的数据库支持交叉应用,您也可以这样做,但它不能正确处理关系

SELECT [....]
FROM Customer c
CROSS APPLY 
(SELECT TOP 1 [...] 
 FROM Orders o
 WHERE c.customerID = o.CustomerID
 ORDER BY o.Order_Amount DESC) o

参见此

如果您的数据库支持交叉应用,您也可以这样做,但它不能正确处理关系

SELECT [....]
FROM Customer c
CROSS APPLY 
(SELECT TOP 1 [...] 
 FROM Orders o
 WHERE c.customerID = o.CustomerID
 ORDER BY o.Order_Amount DESC) o

请参见此

如果客户有两个相同金额的订单,请参见DBA.SE?如果客户有两个相同金额的订单,请参见DBA.SE?这正是我要发布的内容,只是无法理顺我的想法。这不起作用,因为您缺少GROUP BY子句,并且其中有一个MAXORDER_日期。您可能最好只是删除列。另外,ORDER BY应该是ORDER\u Amount而不是ORDER\u DATE谢谢Conrad-误读了这个问题,并引入了一个拼写错误。我要发布的内容就是,无法理顺我的想法。这不起作用,因为您缺少GROUP BY子句,并且您有一个MAXORDER\u日期。您可能最好只是删除列。另外,orderby应该是ORDER\u Amount而不是ORDER\u date。感谢Conrad-误读了这个问题,并引入了一个typo.RANK,它位于Oracle、db2、Sybase中。它唯一的SQL2005和更高版本的.RANK在Oracle、db2和Sybase中。这是唯一的SQL 2005及更高版本。如果您解释此代码解决OP问题的原因,这会有所帮助。当使用现有答案回答较旧的问题时,它有助于解释您的答案与现有答案不同的原因。例如,您可以解释为什么您的答案与Martin的不同。如果您解释为什么此代码可以解决OP的问题,则会有所帮助。当使用现有答案回答较旧的问题时,可以解释您的答案与现有答案不同的原因。例如,你可以解释为什么你的答案与马丁的不同。