Единая синтаксис для SQL Server и Oracle для расчета стандартного отклонения

Вопрос или проблема

Теперь для расчета стандартного отклонения я использую следующий запрос в Oracle

SELECT rating,
       STDDEV(duration) AS StD
FROM ratings
GROUP BY rating

и следующий для SQL Server

SELECT rating,
       STDEV(duration) AS StD
FROM ratings
GROUP BY rating

Но они различаются только по используемой функции стандартного отклонения — STDDEV в Oracle и STDEVP в SQL Server.

Как унифицировать этот запрос, не используя представления, в обеих СУБД? Невозможно создать пользовательскую агрегатную функцию или использовать stdev в пользовательской функции в SQL Server. Я мог бы использовать пакет в Oracle, если бы это позволило мне достичь этого.

Их расчеты различаются, поэтому они дают разные результаты.

  • Oracle’s STDDEV вычисляет выборочное стандартное отклонение (делит на N – 1).
  • SQL Server’s STDEVP вычисляет популяционное стандартное отклонение (делит на N)

Чтобы рассчитывать вручную, используя SQL, общий для обоих:

Выборочное стандартное отклонение

SELECT
    rating,
    CASE WHEN COUNT(*) > 1 THEN
        SQRT(
            (
                SUM(duration * duration) - POWER(SUM(duration), 2) / COUNT(*)
            ) / (COUNT(*) - 1)
        )
    ELSE
        NULL
    END AS StD
FROM ratings
GROUP BY rating;

Популяционное стандартное отклонение

SELECT
    rating,
    SQRT(
        (
            SUM(duration * duration) - POWER(SUM(duration), 2) / COUNT(*)
        ) / COUNT(*)
    ) AS StD
FROM ratings
GROUP BY rating;

.

Ответ или решение

Для расчета стандартного отклонения в системах управления базами данных (СУБД) Oracle и SQL Server часто используются разные функции: Oracle применяет STDDEV, а SQL Server — STDEV, что может приводить к различиям в результатах вычислений. Важно понимать эти различия для корректного объединения запросов, так как одна функция рассчитывает выборочное стандартное отклонение, а другая — генеральное.

Различия в расчетах стандартного отклонения

  1. Oracle (STDDEV): Рассчитывает выборочное стандартное отклонение, используя формулу:
    [
    s = \sqrt{\frac{\sum (x_i – \bar{x})^2}{n – 1}}
    ]
    где ( n ) — размер выборки.

  2. SQL Server (STDEV): Также рассчитывает выборочное стандартное отклонение, аналогично Oracle. В то же время, функция STDEVP в SQL Server используется для вычисления генерального стандартного отклонения, основываясь на формуле:
    [
    \sigma = \sqrt{\frac{\sum (x_i – \mu)^2}{N}}
    ]
    где ( N ) — размер генеральной совокупности.

Из-за различий в использовании этих функций в двух СУБД вы можете столкнуться с проблемами при необходимости единого синтаксиса.

Унификация синтаксиса для обоих СУБД

Для того чтобы написать единый запрос, который будет работать как в Oracle, так и в SQL Server, можно использовать математические формулы вместо встроенных функций.

Выборочное стандартное отклонение

SELECT
    rating,
    CASE 
        WHEN COUNT(*) > 1 THEN
            SQRT(
                (SUM(duration * duration) - POWER(SUM(duration), 2) / COUNT(*)) / (COUNT(*) - 1)
            )
        ELSE
            NULL 
    END AS StD
FROM ratings
GROUP BY rating;

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

Генеральное стандартное отклонение

Если необходимо получить общее стандартное отклонение, следуя аналогичному подходу, то запрос будет выглядеть так:

SELECT
    rating,
    CASE 
        WHEN COUNT(*) > 0 THEN
            SQRT(
                (SUM(duration * duration) - POWER(SUM(duration), 2) / COUNT(*)) / COUNT(*)
            )
        ELSE
            NULL 
    END AS StD
FROM ratings
GROUP BY rating;

Заключение

Таким образом, используя предложенные выше SQL-запросы, вы сможете унифицировать подход к расчету стандартного отклонения для обеих СУБД без создания представлений или пользовательских агрегатных функций. Оба подхода обеспечивают согласованность результатов и позволяют учитывать различия в методах расчета.

Оцените материал
Добавить комментарий

Капча загружается...