Рассчитать среднее третье снизу в DAX - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь получить среднее значение нижней трети данных, в которых заработная плата отсортирована по возрастанию заработной платы.Я попытался просто вернуть TOPN, используя фильтр, чтобы не включать значения заработной платы BLANK ().Затем мне нужно просто выбрать столбец, который меня интересует, в расчете СРЕДНЕГО.Поэтому я написал что-то вроде следующего, где [withSalaryJobCount] - это вычисляемая мера, представляющая собой только количество строк, у которых есть не BLANK столбец yearSalary:

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-вычислений, которые дают мне процентильную заработную плату, а также то, что мы называем заработной платой на начальном и среднем уровнях.Список заработной платы заносится в таблицу, отсортированная по значению в столбце 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))

ФИЛЬТРиспользуется потому, что у нас есть минимальное требование, чтобы было как минимум 7 записей с зарплатой в будущем.

Мой вопрос: как преобразовать запись / опыт в запрос DAX / мера?

(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]

1 Ответ

0 голосов
/ 26 февраля 2019

Итак, после того, как я сильно ударился головой о стену, я так и сделал.Сначала мне нужно было ранжировать строки в наборе по столбцу [salaryAnnual].Но, поскольку многие записи могут иметь одинаковую зарплату, я также немного подправил вычисления, используя уникальный идентификатор, присвоенный строке:

RANKX(
    'TABLE',
    'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
    ,
    ASC
    )

Затем я использовал это значение, чтобы дать мне нижнюю треть строк с зарплатой(measure [withSalaryJobCount]):

TOPN(
    1 + ( [withSalaryJobCount]/3),
    'TABLE',
    RANKX(
        'TABLE',
        'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
        ,
        ASC
        ),
    ASC
    )

Наконец, мне нужно было только получить столбец [salaryAnnual], который не является нулевым, и только извлечь столбец [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]
    )
...