SQL - 获取每行视图的不同值的平均值
SQL - Get the average of distinct values on each row of view
我需要帮助返回 SQL 服务器的 SQL 视图中的当前值。
我有很多列在 SQL 视图中由 UNION ALL
连接。其中一个值是该个人一年的平均工资。
当前视图类似于:
Person
Location
Average
A
X
30,000
B
Y
40,000
C
X
50,000
D
Z
30,000
E
Y
60,000
(请原谅虚拟变量和数据)
此平均值是根据不同 table 中的两个值计算得出的,并已通过 LEFT OUTER JOIN
加入到视图中。这意味着任何基于 [Average]
的未来计算都将在 cte
.
之外
我现在想添加另一个获得 'Package Average' 的列。这是平均值中的平均值,但每个值只占一次。在此示例中,这将是 45,000(如果我们计算第二个 30,000,则为 42,000)。
我也希望将这个 Package Average 放在视图的每一行。
我知道 AVG(DISTINCT [Average])
但这需要汇总。
我也知道分析函数 avg([Average])
但是它不适用于 DISTINCT
.
如有任何建议,我们将不胜感激。
您可以加入计算打包平均值的 sub-query。
例如:
create view test_view as
select *
from (values
('A', 'X', 30000),
('B', 'Y', 40000),
('C', 'X', 50000),
('D', 'Z', 30000),
('E', 'Y', 60000)
) v(Person, Location, Average)
select v.*, q.*
from test_view v
cross join (
select avg(distinct average) as PackageAverage
from test_view
) q
Person | Location | Average | PackageAverage
:----- | :------- | ------: | -------------:
A | X | 30000 | 45000
B | Y | 40000 | 45000
C | X | 50000 | 45000
D | Z | 30000 | 45000
E | Y | 60000 | 45000
db<>fiddle here
不幸的是,正如您所说,window 函数没有 DISTINCT
。但是你可以用 ROW_NUMBER
:
破解它
- 计算每个不同值的 row-number。
- 有条件地仅聚合 row-number 为 1
的那些值
WITH YourView AS (
SELECT *
FROM (VALUES
('A', 'X', 30000),
('B', 'Y', 40000),
('C', 'X', 50000),
('D', 'Z', 30000),
('E', 'Y', 60000)
) v(Person, Location, Average)
),
Ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY v.Average ORDER BY Person) AS rn
FROM YourView v
)
SELECT *,
AVG(CASE WHEN r.rn = 1 THEN r.Average END) OVER ()
FROM Ranked r;
我需要帮助返回 SQL 服务器的 SQL 视图中的当前值。
我有很多列在 SQL 视图中由 UNION ALL
连接。其中一个值是该个人一年的平均工资。
当前视图类似于:
Person | Location | Average |
---|---|---|
A | X | 30,000 |
B | Y | 40,000 |
C | X | 50,000 |
D | Z | 30,000 |
E | Y | 60,000 |
(请原谅虚拟变量和数据)
此平均值是根据不同 table 中的两个值计算得出的,并已通过 LEFT OUTER JOIN
加入到视图中。这意味着任何基于 [Average]
的未来计算都将在 cte
.
我现在想添加另一个获得 'Package Average' 的列。这是平均值中的平均值,但每个值只占一次。在此示例中,这将是 45,000(如果我们计算第二个 30,000,则为 42,000)。
我也希望将这个 Package Average 放在视图的每一行。
我知道 AVG(DISTINCT [Average])
但这需要汇总。
我也知道分析函数 avg([Average])
但是它不适用于 DISTINCT
.
如有任何建议,我们将不胜感激。
您可以加入计算打包平均值的 sub-query。
例如:
create view test_view as select * from (values ('A', 'X', 30000), ('B', 'Y', 40000), ('C', 'X', 50000), ('D', 'Z', 30000), ('E', 'Y', 60000) ) v(Person, Location, Average)
select v.*, q.* from test_view v cross join ( select avg(distinct average) as PackageAverage from test_view ) q
Person | Location | Average | PackageAverage :----- | :------- | ------: | -------------: A | X | 30000 | 45000 B | Y | 40000 | 45000 C | X | 50000 | 45000 D | Z | 30000 | 45000 E | Y | 60000 | 45000
db<>fiddle here
不幸的是,正如您所说,window 函数没有 DISTINCT
。但是你可以用 ROW_NUMBER
:
- 计算每个不同值的 row-number。
- 有条件地仅聚合 row-number 为 1 的那些值
WITH YourView AS (
SELECT *
FROM (VALUES
('A', 'X', 30000),
('B', 'Y', 40000),
('C', 'X', 50000),
('D', 'Z', 30000),
('E', 'Y', 60000)
) v(Person, Location, Average)
),
Ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY v.Average ORDER BY Person) AS rn
FROM YourView v
)
SELECT *,
AVG(CASE WHEN r.rn = 1 THEN r.Average END) OVER ()
FROM Ranked r;