PLSQL-параметрическое определение групповой функции - PullRequest
1 голос
/ 12 апреля 2011

У меня есть таблица, в которой я хочу применить некоторые функции агрегирования, имеющие в качестве критериев группировку специального элемента конкретного столбца.Предположим, приведенный ниже пример:

TIMESTAMP   SITE    VALUE

10:00            A  100
10:00            B  50
10:00            C  25
10:00            D  25
10:05            A  25
10:05            B  15
10:05            C  5
10:05            D  10

Я хочу найти среднее значение группировки по SITE, TIMESTAMP, но для сайта A, B я хочу, чтобы оно оценивалось как единое, то естьREPLACE B WITH A есть И ПОТОМ найдите среднее:

TIMESTAMP   SITE    VALUE
10:00            A  75
10:00            A  75
10:00            C  25
10:00            D  25
10:05            A  20
10:05            A  20
10:05            C  5
10:05            D  10

Один из способов - обновить настройки таблицы B=A, но это не такое сложное решение, если я хочу в будущем сгруппировать больше SITES

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Вам не нужно обновлять таблицу.

SELECT CASE site WHEN 'B' THEN 'A' ELSE site END as site
      ,timestamp
      ,AVG(value)
FROM sites
GROUP BY CASE site WHEN 'B' THEN 'A' ELSE site END
        ,timestamp
;
0 голосов
/ 12 апреля 2011

Вы можете найти средние значения нескомбинированных и комбинированных сайтов по отдельности, а затем объединить их вместе, как это -

SELECT timestamp, site, AVG(value) FROM
(
    -- uncombined
    SELECT timestamp, site, value FROM TABLE WHERE site NOT IN ('A', 'B')

    UNION ALL

    -- combined A, B
    SELECT timestamp, 'AB' site, AVG(value) val
    FROM TABLE
    GROUP BY timestamp
    WHERE site IN ('A', 'B') 
) U
GROUP BY timestamp, site

Просто идея, не проверенная sql

...