Как использовать STDEV over () в SQL Server 2017 Express? - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь получить STDEV столбца MCW_NM, но я хочу, чтобы он был STDEV всех строк , а не для группы по BLADEID. Но в Variance_Blade_MCW мне нужно, чтобы он был сгруппирован по BLADEID. Я попытался через (), но я получаю эту ошибку:

Столбец 'ENG.DBO.MCW_BCL_WEDGE.MCW_NM' недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Кто-нибудь может мне помочь? Ниже мой запрос.

PS : Мне трудно объяснить проблему, поэтому, пожалуйста, потерпите меня. Дайте мне знать, если у вас есть разъяснения! Большое спасибо!

SELECT 
    BladeID,
    Total_Sigma_MCW = STDEV(MCW_NM) OVER (), 
    CountD_Blade = COUNT(BLADEID) OVER (), 
    Variance_Blade_MCW = SQUARE(STDEV(MCW_NM))
FROM 
    ENG.DBO.MCW_BCL_WEDGE 
WHERE 
    TESTDATE > GETDATE() - 6
GROUP BY 
    BLADEID 
HAVING
    COUNT(BladeID) >= 5000

1 Ответ

1 голос
/ 09 мая 2019

В данный момент у меня нет доступа к mssql, но это может сработать.Внутренний запрос возвращает 1 строку на BladeID с теми, которые я считаю нужными вам агрегатами.Проблема в том, что оконные функции всегда возвращают по 1 строке для каждой строки в источнике, поэтому внешний запрос сглаживает это.

SELECT DISTINCT
    BladeID,
    Total_Sigma_MCW = STDEV(MCW_NM) OVER (PARTITION BY 1),
    Variance_Blade_MCW, 
    CountD_Blade,
FROM
(
SELECT 
    BladeID,
    MCW_NM, 
    CountD_Blade = COUNT() OVER (PARTITION BY BladeID), 
    Variance_Blade_MCW = SQUARE(STDEV(MCW_NM) OVER (PARTITION BY BLADEID))
FROM 
    ENG.DBO.MCW_BCL_WEDGE 
WHERE 
    TESTDATE > GETDATE() - 6
) q
WHERE CountD_Blade >= 5000

Может быть более эффективно создать два запроса, один для группировки по BladeID, а другой - дляполный набор данных и присоединиться к ним.

...