Sql 无法使用行号和分组依据检索列值最高的行

Sql 无法使用行号和分组依据检索列值最高的行,sql,sql-server,Sql,Sql Server,我正在处理一个查询,该查询返回每种产品中价格最高的一行 SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Price DESC) RN FROM @BestBids ) a WHERE RN=1 比如我有 表T1 Product Price Tax Location Pen 10 2.25 A Pen 5 1.25 B Pen

我正在处理一个查询,该查询返回每种产品中价格最高的一行

SELECT * FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Price DESC) RN
    FROM @BestBids
) a
WHERE RN=1
比如我有

表T1

Product Price Tax   Location
Pen     10    2.25  A
Pen      5    1.25  B
Pen     15    1.5   A 
Board   25    5.26  A
Board    2    NULL  B
Water    5    10    A
结果应该是这样的

Product Price Tax   Location       
 Pen     15    1.5   A 
 Board   25    5.26  A
 Water    5    10    A
我正在使用
行数()
分组依据
通过以下方法实现此目的

ALTER VIEW [dbo].[InferredBestBids]
AS
    SELECT  ROW_NUMBER() OVER ( ORDER BY ( SELECT   NULL
                                         ) ) AS id ,
            product ,
            MAX(price) AS Price ,
            MIN(tax) AS Tax ,
            location
    FROM    [dbo].InferredBids_A
    WHERE   NOT ( proce IS NULL
                  AND tax IS NULL
                )
    GROUP BY market ,
            term
GO
当我运行上述查询时,它抛出了错误

Column 'dbo.InferredBids_A.Location' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

当我尝试按
位置
对查询结果进行分组时,它返回了一个
产品
的多行,结果不正确,具体取决于
位置

如果您正确使用了行号子句,然后仅根据行号进行选择,则不需要使用
分组方式
。如果您出于其他原因需要,可以在外部查询的前面添加一个额外的
row\u number
调用


如果正确地使用了行号子句,然后仅根据行号选择,则不需要
分组依据
。如果您出于其他原因需要,可以在外部查询的前面添加一个额外的
row\u number
调用


如果正确地使用了行号子句,然后仅根据行号选择,则不需要
分组依据
。如果您出于其他原因需要,可以在外部查询的前面添加一个额外的
row\u number
调用


如果正确地使用了行号子句,然后仅根据行号选择,则不需要
分组依据
。如果您出于其他原因需要,可以在外部查询的前面添加一个额外的
row\u number
调用


如果选择了已聚合的内容,则必须按选择列表中未聚合的任何其他内容进行分组:

SELECT Product, Price ,Tax, Location
FROM (SELECT Product, Price ,Tax, Location, 
    RANK() OVER (PARTITION BY Product ORDER BY Price DESC) N
    FROM InferredBids_A
    WHERE Price IS NOT NULL AND Tax IS NOT NULL
) T WHERE N = 1

RANK
将为领带指定行,如果您不关心这些,请使用
行号

如果您选择了已聚合的内容,则必须按
分组
选择列表中未聚合的其他内容:

SELECT Product, Price ,Tax, Location
FROM (SELECT Product, Price ,Tax, Location, 
    RANK() OVER (PARTITION BY Product ORDER BY Price DESC) N
    FROM InferredBids_A
    WHERE Price IS NOT NULL AND Tax IS NOT NULL
) T WHERE N = 1

RANK
将为领带指定行,如果您不关心这些,请使用
行号

如果您选择了已聚合的内容,则必须按
分组
选择列表中未聚合的其他内容:

SELECT Product, Price ,Tax, Location
FROM (SELECT Product, Price ,Tax, Location, 
    RANK() OVER (PARTITION BY Product ORDER BY Price DESC) N
    FROM InferredBids_A
    WHERE Price IS NOT NULL AND Tax IS NOT NULL
) T WHERE N = 1

RANK
将为领带指定行,如果您不关心这些,请使用
行号

如果您选择了已聚合的内容,则必须按
分组
选择列表中未聚合的其他内容:

SELECT Product, Price ,Tax, Location
FROM (SELECT Product, Price ,Tax, Location, 
    RANK() OVER (PARTITION BY Product ORDER BY Price DESC) N
    FROM InferredBids_A
    WHERE Price IS NOT NULL AND Tax IS NOT NULL
) T WHERE N = 1
RANK
将给出领带的行数,如果您不关心这些,请使用
行数)

制作一些测试数据:

DECLARE @BestBids TABLE
(
    Product VARCHAR(20),
    Price INT, 
    Tax DECIMAL(10,2),
    Location VARCHAR(10)
)

INSERT INTO @BestBids
VALUES
('Pen', 10, 2.25, 'A'),
('Pen', 5, 1.25,  'B'),
('Pen', 15, 1.5,   'A'), 
('Board', 25, 5.26,  'A'),
('Board', 2, NULL,  'B'),
('Water', 5, 10,   'A');
我们将我们的行号设置为每种产品的最高价格

SELECT * FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Price DESC) RN
    FROM @BestBids
) a
WHERE RN=1
我们包装sql并只选择第一个行号。以下是输出:

Product Price   Tax     Location    RN
Board   25      5.26    A           1
Pen     15      1.50    A           1
Water   5       10.00   A           1
制作一些测试数据:

DECLARE @BestBids TABLE
(
    Product VARCHAR(20),
    Price INT, 
    Tax DECIMAL(10,2),
    Location VARCHAR(10)
)

INSERT INTO @BestBids
VALUES
('Pen', 10, 2.25, 'A'),
('Pen', 5, 1.25,  'B'),
('Pen', 15, 1.5,   'A'), 
('Board', 25, 5.26,  'A'),
('Board', 2, NULL,  'B'),
('Water', 5, 10,   'A');
我们将我们的行号设置为每种产品的最高价格

SELECT * FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Price DESC) RN
    FROM @BestBids
) a
WHERE RN=1
我们包装sql并只选择第一个行号。以下是输出:

Product Price   Tax     Location    RN
Board   25      5.26    A           1
Pen     15      1.50    A           1
Water   5       10.00   A           1
制作一些测试数据:

DECLARE @BestBids TABLE
(
    Product VARCHAR(20),
    Price INT, 
    Tax DECIMAL(10,2),
    Location VARCHAR(10)
)

INSERT INTO @BestBids
VALUES
('Pen', 10, 2.25, 'A'),
('Pen', 5, 1.25,  'B'),
('Pen', 15, 1.5,   'A'), 
('Board', 25, 5.26,  'A'),
('Board', 2, NULL,  'B'),
('Water', 5, 10,   'A');
我们将我们的行号设置为每种产品的最高价格

SELECT * FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Price DESC) RN
    FROM @BestBids
) a
WHERE RN=1
我们包装sql并只选择第一个行号。以下是输出:

Product Price   Tax     Location    RN
Board   25      5.26    A           1
Pen     15      1.50    A           1
Water   5       10.00   A           1
制作一些测试数据:

DECLARE @BestBids TABLE
(
    Product VARCHAR(20),
    Price INT, 
    Tax DECIMAL(10,2),
    Location VARCHAR(10)
)

INSERT INTO @BestBids
VALUES
('Pen', 10, 2.25, 'A'),
('Pen', 5, 1.25,  'B'),
('Pen', 15, 1.5,   'A'), 
('Board', 25, 5.26,  'A'),
('Board', 2, NULL,  'B'),
('Water', 5, 10,   'A');
我们将我们的行号设置为每种产品的最高价格

SELECT * FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Price DESC) RN
    FROM @BestBids
) a
WHERE RN=1
我们包装sql并只选择第一个行号。以下是输出:

Product Price   Tax     Location    RN
Board   25      5.26    A           1
Pen     15      1.50    A           1
Water   5       10.00   A           1

您可以使用公共表表达式:

WITH    cte
          AS ( SELECT   product ,
                        MAX(price) AS price
               FROM     dbo.InferredBids_A
             )
    SELECT  product ,
            price ,
            tax ,
            location
    FROM    dbo.InferredBids_A tbl
            INNER JOIN cte ON cte.product = tbl.product
                              AND cte.price = tbl.price

您可以使用公共表表达式:

WITH    cte
          AS ( SELECT   product ,
                        MAX(price) AS price
               FROM     dbo.InferredBids_A
             )
    SELECT  product ,
            price ,
            tax ,
            location
    FROM    dbo.InferredBids_A tbl
            INNER JOIN cte ON cte.product = tbl.product
                              AND cte.price = tbl.price

您可以使用公共表表达式:

WITH    cte
          AS ( SELECT   product ,
                        MAX(price) AS price
               FROM     dbo.InferredBids_A
             )
    SELECT  product ,
            price ,
            tax ,
            location
    FROM    dbo.InferredBids_A tbl
            INNER JOIN cte ON cte.product = tbl.product
                              AND cte.price = tbl.price

您可以使用公共表表达式:

WITH    cte
          AS ( SELECT   product ,
                        MAX(price) AS price
               FROM     dbo.InferredBids_A
             )
    SELECT  product ,
            price ,
            tax ,
            location
    FROM    dbo.InferredBids_A tbl
            INNER JOIN cte ON cte.product = tbl.product
                              AND cte.price = tbl.price

指定的结果集不存在;t不需要
MAX()
分组依据
。看起来您想要的是:
ROW_NUMBER()(按产品订单按价格描述划分)作为rn
和WHERE子句中的谓词
rn=1
;t不需要
MAX()
分组依据
。看起来您想要的是:
ROW_NUMBER()(按产品订单按价格描述划分)作为rn
和WHERE子句中的谓词
rn=1
;t不需要
MAX()
分组依据
。看起来您想要的是:
ROW_NUMBER()(按产品订单按价格描述划分)作为rn
和WHERE子句中的谓词
rn=1
;t不需要
MAX()
分组依据
。看起来您想要的是:
ROW_NUMBER()(按产品订单按价格描述划分)作为rn
和WHERE子句中的谓词
rn=1