Выберите строки, в которых нет записей за последние 100 лет - PullRequest
0 голосов
/ 22 октября 2018

Извините, название не очень хорошее, но я не знаю, как правильно описать мою проблему.

Я пытаюсь получить таблицу с названиями городов, в которой произошла катастрофа, по крайней мере, 100лет и с тех пор, как в этом городе не было больше бедствий по крайней мере 100 лет

, поэтому мой код работает, но когда в моей таблице бедствий есть город, в котором только одна катастрофа, город не появится (даже если он был в 1800 году, например)

select D1.cname,D1.etype,D1.dyear
from disaster as D1 , disaster as D2
where(D1.dyear<=(date_part('year',current_date)-100)) and((D2.cname=D1.cname)and ((D2.dyear>(D1.dyear+100))))                                                                                     
group by D1.cname,D1.dyear

это моя база данных

enter image description here

и это то, что я получаю из моего запроса

enter image description here

я пропускаю города "Цфат" и "Кагосима"

Я ищу вашу помощь Спасибо!

с помощью @ZaynulАбадин Тухин после присоединения, но по-прежнему не отображает города с одной катастрофой enter image description here

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Оконные функции - более естественный способ выразить эту логику:

select d.*
from (select d.*,
             lag(dyear) over (partition by cname order by dyear) as prev_dyear
      from disaster d
     ) d
where dyear >= date_part('year', current_date) - 100 and
      (prev_dyear is null or prev_dyear < dyear - 100)
0 голосов
/ 22 октября 2018

Это должно работать:

select D1.cname,D2.dtype,D1.dyear
from 
(
  select cname, min(dyear) as dyear
  from disaster
  where dyear<=(date_part('year',current_date)-100)
  and not exists (
    select * from disaster D3 
    where D3.cname = disaster.cname 
    and D3.dyear > disaster.dyear 
    and D3.dyear < disaster.dyear+100
  )
  group by cname
) D1
join disaster D2 on D1.cname = D2.cname and D2.dyear = D1.dyear

Показывает только последнее стихийное бедствие тех городов, где не произошло ни одного стихийного бедствия в течение 100 лет после этого последнего стихийного бедствия

0 голосов
/ 22 октября 2018

использовать явное объединение, а не имя таблицы, разделенное запятыми, что делает перекрестное объединение между двумя таблицами

select distinct D1.cname,D1.etype,D1.dyear
from disaster as D1  join disaster as D2
on (D1.dyear<=(date_part('year',current_date)-100)) and((D2.cname=D1.cname)and ((D2.dyear>(D1.dyear+100))))                                                                                     

Я удалил группу, так как я не видел агрегации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...