很抱歉,标题不是很好,但是我不知道如何正确地描述我的问题
我正在尝试提供一张具有至少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
这是我的数据库
这就是我从查询中得到的信息
我错过了城市“ Tsfat”和“鹿儿岛”
我正在寻找您的帮助,谢谢!
加入后,在@Zaynul Abadin Tuhin的帮助下,,但仍然没有显示只有一场灾难的城市
答案 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年来未发生灾难的城市中的最后一次灾难