计算 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]
    )