У меня нет твоего стола, поэтому мне сложно сформировать правильный sql, который определенно работает, но я могу попробовать и надеяться, что смогу тебе помочь.
Сначала мне нужно взять декартово произведение опросов против себя и отфильтровать строки, которые мне не нужны
select s1.survey_id x, s2.survey_id y from surveys s1, surveys s2 where s1.survey_id != s2.survey_id and s1.ip_address = s2.ip_address and (s1.created and s2.created fall 6 months within each other)
Вывод этого должен содержать каждую пару опросов, которые соответствуют (согласно вашим правилам) ДВАЖДЫ (один раз для каждого идентификатора в 1-й позиции и один раз для того, чтобы он был во 2-й позиции)
Затем мы можем сделать GROUP BY
на выходе этого, чтобы получить таблицу, которая в основном дает мне правильный ip_count для каждого survey_id
(select x, count(*) c from (select s1.survey_id x, s2.survey_id y from surveys s1, surveys s2 where s1.survey_id != s2.survey_id and s1.ip_address = s2.ip_address and (s1.created and s2.created fall 6 months within each other)) group by x)
Итак, теперь у нас есть таблица, отображающая каждый survey_id на его правильный ip_count. Чтобы обновить исходную таблицу, нам нужно объединить ее с этим и скопировать значения в
Так что это должно выглядеть примерно так:
UPDATE surveys SET s.ip_count = n.c from surveys s inner join (ABOVE QUERY) n on s.survey_id = n.x
Там есть некоторый псевдокод, но я думаю, что общая идея должна работать
Раньше мне никогда не приходилось обновлять таблицу на основе результатов другого запроса. Попытка угадать правильный синтаксис для этого из этого вопроса - Как ОБНОВИТЬ из SELECT в SQL Server?
Также, если бы мне нужно было сделать что-то подобное для моей собственной работы, я бы не стал пытаться сделать это в одном запросе. Это было бы трудно поддерживать и могло бы иметь проблемы с памятью / производительностью. Лучше всего, чтобы скрипт проходил по таблице строку за строкой, обновлял одну строку в транзакции перед тем, как перейти к следующей строке. Намного медленнее, но проще для понимания и, возможно, легче в вашей базе данных.