#sql #postgresql
#sql #postgresql
Вопрос:
Я использую postgresql.
У меня есть таблица, которая выглядит следующим образом
| id1 | id2 |
------------------------------------
| 1 | 6 |
| 1 | 12 |
| 2 | 6 |
| 3 | 1 |
| 3 | 2 |
| 2 | 2 |
Я пытаюсь разработать запрос, который задал бы, например: id1 = 1, он вернет все id1 с их перекрытием в id2 по отношению к заданному id1. Не включайте данный id1 в результаты.
Например, если бы было задано id1=1, результат должен быть:
| id1 | num_occurences |
------------------------------------
| 2 | 1 |
| 3 | 0 |
id1 из 2 вернет 1, потому что id1= 1 и id1 = 2 имеют только общий id2 = 6. id1 из 3 возвращает 0, потому что вхождений нет перекрытия.
Я думаю, что, возможно, захочу использовать внутреннее СОЕДИНЕНИЕ, но я не уверен.
Есть предложения?
Ответ №1:
Поскольку вам также нужны нулевые результаты, вы могли бы использовать ЛЕВОЕ соединение для проверки условия;
SELECT a.id1, COUNT(b.id1) num_occurences
FROM mytable a
LEFT JOIN mytable b ON a.id2 = b.id2 AND b.id1 = [id]
WHERE a.id1 <> [id]
GROUP BY a.id1
…где в вашем случае [id]=1.
Что он делает, так это проверяет для каждой строки в «b» (с id1 = 1), есть ли строка в «a» с тем же id2 и id1 <> 1. Затем все, что ему нужно сделать, это сгруппировать и подсчитать результаты.
Ответ №2:
SELECT id1, SUM( CASE
WHEN id1=id2 THEN 1
ELSE 0
END )
AS num_occurences
FROM table
GROUP by id1
В тот день не было выполнено ни одного соединения.
Комментарии:
1. Спасибо за информацию. Похоже, что это суммирование случаев id1= id2. Это не то, о чем задается вопрос.
2. В этом случае я неверно истолковал то, что вы имели в виду, когда id1 перекрывался с id2. Вы имели в виду «какие другие строки имеют тот же id2, что и у меня, без учета меня?»