Как рассчитать средние элементы, которые - PullRequest
1 голос
/ 10 марта 2020

Я работаю с postgres

У меня есть таблица (tbl) со следующими полями: name, words тип полей - строки)

Мне нужно вычислить для каждого name (что составляет aaa) средний процент words, которые не равны нулю

Я пробовал что-то вроде:

SELECT AVG(COUNT(words is not null) - count(*))
FROM tbl
WHERE name="test"

Но я получил следующую ошибку :

aggregate function calls cannot be nested

Я пытался изменить запрос на:

SELECT (AVG((SELECT COUNT(*) FROM tbl WHERE words IS NOT NULL) - (SELECT COUNT(*) FROM tbl))
FROM tbl
WHERE name="test" 

, но кажется, что я получил неправильные значения.

Например, для следующей таблицы:

name,   words 
----------------------------
test    abc test, 1, 2, 3
t2      NULL
test    NULL
t3      NULL
t2      a,b,c,d,e
test    def zxy
t2      NULL

результат для test должен быть 2/3 (потому что есть 2 результата test, которые не равны нулю, и в таблице 3 test)

Как правильно написать запрос?

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Вы не можете вложить его,

, поэтому go с подзапросом:

SELECT  
1.0*sum((case when a.words is null then 0 else 1 end))/
(SELECT  count(*) FROM tbl b WHERE b.name= a.name group by b.name)
FROM tbl a
WHERE a.name= 'test'
group by name 

Вывод:

Avg_
0.666666666666
1 голос
/ 10 марта 2020

Я нашел решение:

SELECT CAST((CAST((SELECT COUNT(*)
FROM tbl
WHERE name="test" and words IS NOT NULL) as float)/(SELECT COUNT(*)FROM tbl WHERE name="test")) as float) as result
FROM tbl
WHERE name="test"
GROUP BY Country
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...