Количество перекрытий таблиц PostgreSQL

#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. Затем все, что ему нужно сделать, это сгруппировать и подсчитать результаты.

SQLFiddle для тестирования с помощью.

Ответ №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, что и у меня, без учета меня?»