sql - 基于另一列日期的 SQL 返回日期
问题描述
我有一个降雨预报表,可以预测两个城市的预计下雨日期。该表如下所示:
CREATE TABLE raincheck(
city varchar(255),
expected_rain_date date,
actual_rain_date date);
INSERT INTO raincheck
(city,expected_rain_date,actual_rain_date) VALUES
('NYC','2001-02-02',null),
('NYC','2001-02-11',null),
('NYC','2001-03-20','2001-03-21'),
('NYC','2001-03-25',null),
('NYC','2001-04-10',null),
('NYC','2001-04-12','2001-04-12'),
('LDN','2001-02-03',null),
('LDN','2001-02-07','2001-02-07'),
('LDN','2001-03-11',null),
('LDN','2001-03-12',null),
('LDN','2001-03-17',null),
('LDN','2001-03-20','2001-03-20');
SELECT * FROM raincheck;
由于实际下雨并不总是准确的,我需要一个表格,其中包含第一个预期下雨日期和最新实际下雨日期之间的持续时间。结果如下所示:
CREATE TABLE rainresult(
city varchar(255),
expected_rain_date date,
actual_rain_date date);
INSERT INTO rainresult
(city,expected_rain_date,actual_rain_date) VALUE
('NYC','2001-02-02','2001-03-21'),
('NYC','2001-03-25','2001-04-12'),
('LDN','2001-02-03','2001-02-07'),
('LDN','2001-03-11','2001-03-20');
SELECT * FROM rainresult;
我认为查询可能与NULL有关,例如
SELECT * FROM rainresult WHERE actual_rain_date IS NOT NULL;
但我无法过滤expected_rain_date
解决方案
您希望根据每行上或之后的实际下雨日期计数来分配组。然后聚合:
select city, min(expected_rain_date), max(actual_rain_date)
from (select rc.*,
sum(case when actual_rain_date is not null then 1 else 0 end) over (partition by city order by expected_rain_date desc) as grp
from raincheck rc
) rc
group by city, grp;
这是一个 db<>fiddle。它碰巧使用 Postgres,但这都是标准 SQL。
推荐阅读
- azure - 如何在 CosmosDB 中使用 Join 操作/子查询
- python - 如何在 nltk 中预测 IBM 模型的翻译(解码)?
- cypher - 将 Cypher 查询转换为 gremlin
- azure-devops - 应用程序访问策略
- python - Can I prevent having to pass the same resource argument to instances of different classes
- python - 尽管已设置 Python 类变量为 None
- android - 单击返回底部导航视图后显示项目
- docker - 如何在多阶段构建中的某个阶段启动 docker build?
- python - 将熊猫时间戳中的日期与日期时间,日期进行比较
- xml - 使用 Forech 循环遍历 XML - Groovy