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;

db<>fiddle