计算 DAX 中倒数第三的平均值
Calculate Bottom Third's Average in DAX
我正在尝试获取工资按工资升序排序的数据的后三分之一的平均值。我试图只 return 使用 FILTER 的 TOPN 不包括 BLANK() 工资值。然后我只需要 select 我在 AVERAGE 计算中关心的列。所以我写了类似下面的内容,其中 [withSalaryJobCount] 是一个计算的度量,它只是具有非空白 annualSalary 列的行数:
entryWages:= AVERAGE(
SELECTCOLUMNS(
CALCULATE(
TOPN(
[withSalaryJobCount]- [withSalaryJobCount]/3,
'table',
'table'[salaryAnnual],
ASC
),
FILTER(table, [salaryAnnual] <> BLANK())
),[entryWages]
"bottomThird",
[salaryAnnual]
)
)
这是失败的错误:
The AVERAGE function only accepts a column reference as an argument
原题:
我有一组 SQL 计算,可以给出百分比工资以及我们所说的入门级和经验级工资。工资列表被输入到一个 table 中,并按其值和 IDENTITY 列进行排序。下面列出了用于插入和计算百分位数、条目和经验工资的非常简化的查询:
CREATE TABLE #t1 (
id int identity,
salaryannual decimal(18,2)
)
INSERT INTO #t1
SELECT salaryannual
FROM table a
ORDER BY salaryannual
SELECT
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=minID+(ct/3)) entryLevelSalary,
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=maxID-(ct/3) AND ID<=maxID) experiencedSalary,
(select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + (ct/2+1)/2 or ID = minID + (ct/2+1)/2 + (ct/2+1)%2) q1,
(select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + (ct+1)/2 or ID = minID + (ct+1)/2 + (ct+1)%2 ) median,
(select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + ct+1 - ((ct/2+1)/2 + (ct/2+1)%2) or ID = minID + ct+1 -((ct/2+1)/2) ) q3,
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=maxID) avgSal
FROM
(
SELECT COUNT(*) ct, MIN(ID) minID, MAX(ID) maxID
FROM #t1
) uniqueIDs
转换百分位计算的形式为:
pct25Wages:= Calculate(PERCENTILE.INC('table'[salaryAnnual], .25), FILTER([withSalaryCount] > 6))
使用 FILTER 是因为我们有一个最低要求,即至少有 7 个条目有薪水。
我的问题是如何将 entry/experience 转换为 DAX/measure 查询?
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=minID+(ct/3)) entryLevelSalary,
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=maxID-(ct/3) AND ID<=maxID) experiencedSalary,
我已经尝试使用如下所示的 STDDEV 和 AVG 工资计算,但它没有给出预期的结果,看着它我发现它无论如何都不会像我预期的那样工作:
entryWages:= [avgWages] + 3 * [StdDevWage]
所以,在多次用头撞墙之后,我就是这样完成的。
首先,我需要按 [salaryAnnual] 列对集合中的行进行排名。但是,由于许多条目可能具有相同的薪水,我还通过使用分配给该行的 uniqueID 稍微调整了计算:
RANKX(
'TABLE',
'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
,
ASC
)
然后我用这个值给我倒数第三行的薪水(度量[withSalaryJobCount]):
TOPN(
1 + ( [withSalaryJobCount]/3),
'TABLE',
RANKX(
'TABLE',
'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
,
ASC
),
ASC
)
最后我只需要得到不为空的 [salaryAnnual] 列,并且只从计算的 table 中提取 [salaryAnnual] 列来计算以下的平均值:
AVERAGEX(
SELECTCOLUMNS(
CALCULATETABLE(
TOPN(
1 + ( [withSalaryJobCount]/3),
'TABLE',
RANKX(
'TABLE',
'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
,
ASC
),
ASC
),
FILTER(TABLE, [salaryAnnual] <> BLANK())
),
"bottomThird",
'TABLE'[salaryAnnual]
), [bottomThird]
)
我正在尝试获取工资按工资升序排序的数据的后三分之一的平均值。我试图只 return 使用 FILTER 的 TOPN 不包括 BLANK() 工资值。然后我只需要 select 我在 AVERAGE 计算中关心的列。所以我写了类似下面的内容,其中 [withSalaryJobCount] 是一个计算的度量,它只是具有非空白 annualSalary 列的行数:
entryWages:= AVERAGE(
SELECTCOLUMNS(
CALCULATE(
TOPN(
[withSalaryJobCount]- [withSalaryJobCount]/3,
'table',
'table'[salaryAnnual],
ASC
),
FILTER(table, [salaryAnnual] <> BLANK())
),[entryWages]
"bottomThird",
[salaryAnnual]
)
)
这是失败的错误:
The AVERAGE function only accepts a column reference as an argument
原题: 我有一组 SQL 计算,可以给出百分比工资以及我们所说的入门级和经验级工资。工资列表被输入到一个 table 中,并按其值和 IDENTITY 列进行排序。下面列出了用于插入和计算百分位数、条目和经验工资的非常简化的查询:
CREATE TABLE #t1 (
id int identity,
salaryannual decimal(18,2)
)
INSERT INTO #t1
SELECT salaryannual
FROM table a
ORDER BY salaryannual
SELECT
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=minID+(ct/3)) entryLevelSalary,
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=maxID-(ct/3) AND ID<=maxID) experiencedSalary,
(select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + (ct/2+1)/2 or ID = minID + (ct/2+1)/2 + (ct/2+1)%2) q1,
(select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + (ct+1)/2 or ID = minID + (ct+1)/2 + (ct+1)%2 ) median,
(select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + ct+1 - ((ct/2+1)/2 + (ct/2+1)%2) or ID = minID + ct+1 -((ct/2+1)/2) ) q3,
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=maxID) avgSal
FROM
(
SELECT COUNT(*) ct, MIN(ID) minID, MAX(ID) maxID
FROM #t1
) uniqueIDs
转换百分位计算的形式为:
pct25Wages:= Calculate(PERCENTILE.INC('table'[salaryAnnual], .25), FILTER([withSalaryCount] > 6))
使用 FILTER 是因为我们有一个最低要求,即至少有 7 个条目有薪水。
我的问题是如何将 entry/experience 转换为 DAX/measure 查询?
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=minID+(ct/3)) entryLevelSalary,
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=maxID-(ct/3) AND ID<=maxID) experiencedSalary,
我已经尝试使用如下所示的 STDDEV 和 AVG 工资计算,但它没有给出预期的结果,看着它我发现它无论如何都不会像我预期的那样工作:
entryWages:= [avgWages] + 3 * [StdDevWage]
所以,在多次用头撞墙之后,我就是这样完成的。 首先,我需要按 [salaryAnnual] 列对集合中的行进行排名。但是,由于许多条目可能具有相同的薪水,我还通过使用分配给该行的 uniqueID 稍微调整了计算:
RANKX(
'TABLE',
'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
,
ASC
)
然后我用这个值给我倒数第三行的薪水(度量[withSalaryJobCount]):
TOPN(
1 + ( [withSalaryJobCount]/3),
'TABLE',
RANKX(
'TABLE',
'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
,
ASC
),
ASC
)
最后我只需要得到不为空的 [salaryAnnual] 列,并且只从计算的 table 中提取 [salaryAnnual] 列来计算以下的平均值:
AVERAGEX(
SELECTCOLUMNS(
CALCULATETABLE(
TOPN(
1 + ( [withSalaryJobCount]/3),
'TABLE',
RANKX(
'TABLE',
'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
,
ASC
),
ASC
),
FILTER(TABLE, [salaryAnnual] <> BLANK())
),
"bottomThird",
'TABLE'[salaryAnnual]
), [bottomThird]
)