Как выбрать, используя связанные записи и функцию sql avg из другой таблицы? - PullRequest
0 голосов
/ 28 апреля 2020
table1
user_id  prob
1        0.33
2        0.34
3        0.35
11       0.90
88       0.80
7        0.10
8        0.11
10       0.09
12       0.80
17       0.80
18       0.80
19       0.80
20       0.80

table2
user_id  canon_id 
1        456     
2        456     
3        456      
11       4344      
88       4344      
7        2023      
8        2023      
10       2023      
12       1234      
17       1234      
18       1234      
19       1234      
20       1234     

В вышеприведенном случае, как я могу выбрать записи из table2, где связанные table1.user_ids из table2.canon_id имеют avg (prob)> 0.50. В этом случае canon_id 2023 и связанные с ним user_ids 7,8,10 avg (prob) равны 0,10, поэтому его не следует выбирать.

Ответы [ 4 ]

1 голос
/ 28 апреля 2020

Присоединитесь к table_b до table_a и объединитесь, чтобы получить canon_id s, которые вы хотите:

select * from table_b
where canon_id in (
  select b.canon_id
  from table_b b inner join table_a a
  on a.user_id = b.user_id
  group by b.canon_id
  having avg(a.score) > 0.5
);

См. Демоверсию . Результаты:

| user_id | canon_id |
| ------- | -------- |
| 11      | 4344     |
| 88      | 4344     |
| 12      | 3333     |
| 17      | 3333     |
| 18      | 3333     |
| 19      | 3333     |
| 20      | 3333     |
1 голос
/ 28 апреля 2020
SELECT table2.user_id, AVG(prob) AS prob FROM table2
INNER JOIN table1 ON table1.user_id = table2.user_id
GROUP BY canon_id
HAVING prob > 0.50

Я использовал GROUP BY для агрегирования равных canon _id в одной строке, так что вы можете использовать AVG для вычисления среднего значения из агрегированной строки, затем я использовал HAVING с псевдонимом AVG для удовлетворения условия.

Предложение HAVING используется в операторе SELECT для определения условий фильтрации для группы строк или агрегатов.

Предложение HAVING часто используется с предложением GROUP BY для фильтрации групп на основе указанного условия. Если предложение GROUP BY опущено, предложение HAVING ведет себя подобно предложению WHERE.

0 голосов
/ 28 апреля 2020

Попробуйте следующее. вот демоверсия .

select
    user_id,
    avg_id
from
(
  select
    t1.user_id,
    canon_id,
    avg(prob) over (partition by canon_id) as avg_id
  from table1 t1
  join table2 t2
  on t1.user_id = t2.user_id
) val
where avg_id > 0.5
0 голосов
/ 28 апреля 2020

объедините таблицы, groupby canon_id со средним значением вероятности, превышающим половину

Попробуйте:

SELECT
t2.cannon
FROM table2 t2
JOIN table1 t1 ON t1.user_id = t2.user_id

GROUP BY 1
HAVING AVG(prob) > 0.5
-- will return the canon_ids: 4344, 1234

Пока выполняются следующие условия, приведенный выше запрос даст вам правильный ответ:

  • user_id уникально в table1
  • комбинация (canon_id, user_id) уникально в table2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...