选择过去100年没有记录的行

时间:2018-10-22 10:04:30

标签: sql postgresql

很抱歉,标题不是很好,但是我不知道如何正确地描述我的问题

我正在尝试提供一张具有至少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

我错过了城市“ Tsfat”和“鹿儿岛”

我正在寻找您的帮助,谢谢!

加入后,在@Zaynul Abadin Tuhin的帮助下,

,但仍然没有显示只有一场灾难的城市 enter image description here

3 个答案:

答案 0 :(得分:0)

使用显式联接而不是逗号分隔的表名,这使得两个表之间可以交叉联接

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))))                                                                                     

我删除了分组依据,因为我没有看到任何聚集

答案 1 :(得分:0)

窗口函数是表达这种逻辑的更自然的方法:

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)

答案 2 :(得分:0)

这应该有效:

market_id

仅显示距离上次灾难100年来未发生灾难的城市中的最后一次灾难