@matlex
Влюблен в Python!

Возможно ли отсортировать недвижимость где владелец был один и тот же больше трёх лет подряд?

Возможно ли средствами sql получить записи, где владелец был один и тот же больше трёх лет подряд из таблицы ниже? То есть запрос звучит примерно так - дай мне недвижимость (property_id) и имя владельца, где владелец один и тот же был в течение трёх лет подряд.
93c07d2af38f44a08aac332b2d8e8963.png
Если нет, куда копать? Писать функцию, которая будет брать на себя всю работу и заносить результаты в другую таблицу?
  • Вопрос задан
  • 230 просмотров
Пригласить эксперта
Ответы на вопрос 5
@nozzy
Symfony, Laravel, SQL
Как-то так:
select 
t1.property_reg_num, 
t1.property_owner_name_id 
from property_table t1
inner join
(
 select  
 property_reg_num, 
 property_owner_name_id,
 MIN(property_record_on_year) min_year
 from property_table
 group by property_reg_num, 
 property_owner_name_id
) t2 on t2.property_reg_num = t1.property_reg_num 
        and t2.property_owner_name_id = t1.property_owner_name_id
        and t1.property_record_on_year in (t2.min_year, t2.min_year+1, t2.min_year+2)
group by t1.property_reg_num, 
t1.property_owner_name_id
Ответ написан
Комментировать
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Если подойти к вопросу с точки зрения бизнес-логики, а не sql:
Так ли много случаев когда человек владел недвижимостью больше 3х лет, но при этом с перерывами?
select 
   property_id, property_owner_name_id 
from 
   tablename  
group by 
   property_id, property_owner_name_id 
having 
   count(property_record_on_year) >= 3

А дальше уже проверить эту выборку любым другим способом.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
У mysql с такими запросами печально. Ни оконных функций, ни ещё чего-нибудь полезного.

В порядке утреннего бреда решение в лоб:
select property_reg_num, property_owner_name_id from
    tablename y1
    join tablename y2 using(property_reg_num, property_owner_name_id)
    join tablename y3 using(property_reg_num, property_owner_name_id)
where y2.property_record_on_year = y1.property_record_on_year + 1
and y3.property_record_on_year = y2.property_record_on_year + 1

С уникальным ограничением по property_reg_num & property_owner_name_id & property_record_on_year результат должен быть правильным.
Ответ написан
Комментировать
@vshvydky
на сколько я понимаю требуется использование рекурсивных запросов, если не больно, можно мегрировать в постгре там есть witch
Еще вариант, написать рекурсивную функцию, но она будет городить селектов на каждый айди.
Еще можно изменить структуру таблицы и поле год заменить двумя датами, датой покуки и датой продажи, тогда будет работать простой селект с условием 2-1 > 3....
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
Можно
select * from (
select t1.regid, t1.ownerid, t1.recyear,
          IFNULL((select min(tmp.recyear) from table tmp
                        where (tmp.regid = t1.regid) and (tmp.recyear >= t1.recyear)), currentyear) endyear
 from table t1
) where (endyear - recyear) > 3
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы