Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 如何在使用MAX或MIN聚合函数时从一组记录中选择适当的记录_Sql_Sql Server_Group By - Fatal编程技术网

Sql 如何在使用MAX或MIN聚合函数时从一组记录中选择适当的记录

Sql 如何在使用MAX或MIN聚合函数时从一组记录中选择适当的记录,sql,sql-server,group-by,Sql,Sql Server,Group By,在使用MAX或MIN聚合函数时,如何从一组记录中选择适当的记录,以便记录与聚合函数返回的值匹配 我需要使用NorthWind.products数据库表()来查找每个类别中最昂贵的产品。到目前为止,我已经尝试了两种变体: SELECT CategoryID, ProductID, ProductName, MAX(UnitPrice) MostExpensive FROM [NORTHWND].[dbo].[Products] as A GROUP BY CategoryID; 此代码生成错误

在使用MAX或MIN聚合函数时,如何从一组记录中选择适当的记录,以便记录与聚合函数返回的值匹配

我需要使用NorthWind.products数据库表()来查找每个类别中最昂贵的产品。到目前为止,我已经尝试了两种变体:

SELECT CategoryID, ProductID, ProductName, MAX(UnitPrice) MostExpensive
FROM [NORTHWND].[dbo].[Products] as A
GROUP BY CategoryID; 
此代码生成错误“列'NORTHWND.dbo.Products.ProductID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”我完全理解原因。没关系

第二种变体是:

SELECT CategoryID, ProductID, ProductName
FROM [NORTHWND].[dbo].[Products] as A
WHERE UnitPrice = (
                    SELECT MAX(UnitPrice) FROM [NORTHWND].[dbo].[Products] AS B GROUP BY CategoryID HAVING A.CategoryID = B.CategoryID
                    )

这一个很好,返回的记录是正确的,但我想在第一个选择中有4列,第四列应该是每个类别中的最高价格。我可以更改SQL查询以实现此目的,还是应该尝试第三种变体?

对于
SQL Server>=2005

SELECT *
FROM (
    SELECT CategoryID,
           ProductID,
           ProductName,
           UnitPrice,
           RowNum = ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY UnitPrice DESC)
    FROM dbo.Products
) t
WHERE t.RowNum = 1
SELECT DISTINCT
        p.CategoryID,
        p.ProductID,
        p.ProductName,
        p.UnitPrice
FROM dbo.Products p
JOIN (
    SELECT CategoryID, UnitPrice = MAX(UnitPrice)
    FROM dbo.Products
    GROUP BY CategoryID
) t ON t.UnitPrice = p.UnitPrice AND t.CategoryID = p.CategoryID
对于
SQL Server<2005

SELECT *
FROM (
    SELECT CategoryID,
           ProductID,
           ProductName,
           UnitPrice,
           RowNum = ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY UnitPrice DESC)
    FROM dbo.Products
) t
WHERE t.RowNum = 1
SELECT DISTINCT
        p.CategoryID,
        p.ProductID,
        p.ProductName,
        p.UnitPrice
FROM dbo.Products p
JOIN (
    SELECT CategoryID, UnitPrice = MAX(UnitPrice)
    FROM dbo.Products
    GROUP BY CategoryID
) t ON t.UnitPrice = p.UnitPrice AND t.CategoryID = p.CategoryID