Select 请求仅保留高于平均水平的结果
Select request keep only above average results
尝试让 select 请求工作 select 只有特定列的值高于该列的平均值的条目。
我知道我必须将 AVG() 函数与 GROUP BY 和 HAVING 一起使用,但实际情况如下:
select ProductName,UnitPrice from products
group by productname,unitprice
having UnitPrice>avg(unitprice)
这导致我根本没有条目。
想如果我用
select ProductName,UnitPrice from products
group by productname,unitprice
having UnitPrice>=avg(unitprice)
我得到了一大堆毫无意义的东西,因为它低于平均水平(知道平均水平是 28,8663)。
您可以使用 AVG
在整个 table 上使用 OVER
:
;WITH CTE AS
(
SELECT *,
AVG(UnitPrice) OVER() AvgPrice
FROM products
)
SELECT *
FROM CTE
WHERE UnitPrice > AvgPrice;
这将 return 所有单价大于 ProductName 行的平均价格的行:
SELECT *
FROM (
SELECT ProductName,
UnitPrice ,
AVG(UnitPrice) OVER(PARTITION BY ProductName) Average
FROM products
) t
WHERE UnitPrice > Average;
尝试让 select 请求工作 select 只有特定列的值高于该列的平均值的条目。
我知道我必须将 AVG() 函数与 GROUP BY 和 HAVING 一起使用,但实际情况如下:
select ProductName,UnitPrice from products
group by productname,unitprice
having UnitPrice>avg(unitprice)
这导致我根本没有条目。
想如果我用
select ProductName,UnitPrice from products
group by productname,unitprice
having UnitPrice>=avg(unitprice)
我得到了一大堆毫无意义的东西,因为它低于平均水平(知道平均水平是 28,8663)。
您可以使用 AVG
在整个 table 上使用 OVER
:
;WITH CTE AS
(
SELECT *,
AVG(UnitPrice) OVER() AvgPrice
FROM products
)
SELECT *
FROM CTE
WHERE UnitPrice > AvgPrice;
这将 return 所有单价大于 ProductName 行的平均价格的行:
SELECT *
FROM (
SELECT ProductName,
UnitPrice ,
AVG(UnitPrice) OVER(PARTITION BY ProductName) Average
FROM products
) t
WHERE UnitPrice > Average;