почему эта оконная функция не работает? Я не могу использовать группу - PullRequest
0 голосов
/ 03 марта 2020

Я работаю в MySQL, и у меня есть эта таблица:

url             x   y   count *
abc.com         1   1   2
abc.com         2   1   2
xyz.com         1   56  5
xyz.com         2   71  5
xyz.com         3   59  5
xyz.com         4   67  5
xyz.com         5   59  5

, и я пытаюсь запустить этот код:

count(dh.x) over(partition by dh.url) 

, чтобы получить count of 2 for url of abc.com and a count of 5 for url of xyz.com to be the denominator I divide by in my query below...

эта оконная функция вложена в этот больший CTE:

, stdev_estimates AS (   
    SELECT dh.url
    , CASE SUM(SQUARE(dh.x - xmean)) WHEN 0 THEN 1 ELSE SQRT(SUM(SQUARE(dh.x - xmean)) / (count(dh.x) over(partition by dh.url)) - 1) END AS xstdev
    , SQRT(SUM(SQUARE(dh.y - ymean)) / (count(dh.x) over(partition by dh.url)) - 1) AS ystdev
    , count(dh.x) over(partition by dh.url) 'denom'
    FROM date_hits dh
    INNER JOIN mean_estimates m ON m.url = dh.url
    GROUP BY dh.url, m.xmean, m.ymean, dh.x, dh.y
)
select *
from stdev_estimates

, но когда я пытаюсь запустить внутренний подвыбор, я получаю эту ошибку:

Сообщение 8120, уровень 16, состояние 1, строка 49 Столбец date_hits.x недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Но это не имеет смысла, потому что я думал, что это обходной путь, требующий группу для dh.x? Я думал, что вам не нужно группировать по, если вы используете функцию агрегирования.

Суть в том, что мне не нужно группировать по dh.x, потому что это разбивает мою таблицу на 7 строк, когда я агрегирую все до:

url            xstdev    ystdev
abc.com       .12345    .5679
xyz.com       .23455    .79023

1 Ответ

1 голос
/ 03 марта 2020

Что в оконная функция должна быть выражением, которое соответствует внешнему group by.

Если вы удалите dh.x из предложения group by, вы не сможете его использовать в одиночку вам нужна агрегатная функция.

Предположительно, вы хотите заменить это:

count(dh.x) over(partition by dh.url)

на:

sum(count(dh.x)) over(partition by dh.url)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...