sql - 查询几个不连续范围的最后一个
问题描述
我有一个气象站读数的 postgresql 表:
CREATE TABLE "weather"
(
"id" SERIAL PRIMARY KEY,
"dtstamp" TIMESTAMP NOT NULL UNIQUE,
"temperature" REAL NOT NULL,
...
)
对于园艺,我对第一次和最后一次霜冻的日期很感兴趣。
我可以得到2019年春天的最后一次霜冻:
SELECT dtstamp FROM weather WHERE temperature<0
AND dtstamp BETWEEN '2019-01-01' AND '2019-07-01'
ORDER BY dtstamp DESC LIMIT 1
2019-04-13 00:55:16
还有2019年的初霜:
SELECT dtstamp FROM weather WHERE temperature<0
AND dtstamp BETWEEN '2019-07-01' AND '2019-12-31'
ORDER BY dtstamp ASC LIMIT 1
2019-10-28 03:59:20
其他年份也是如此。我如何在几年内查询这个表?
解决方案
您可以提取月份进行过滤和聚合。例如:
SELECT EXTRACT(year FROM dtstamp),
MAX(dtstamp) FILTER (WHERE temperature < 0)
FROM weather
WHERE temperature < 0 AND
EXTRACT(month FROM dtstamp) < 7
GROUP BY EXTRACT(year FROM dtstamp);
和:
SELECT EXTRACT(year FROM dtstamp),
MIN(dtstamp) FILTER (WHERE temperature < 0)
FROM weather
WHERE temperature < 0 AND
EXTRACT(month FROM dtstamp) >= 7
GROUP BY EXTRACT(year FROM dtstamp);
您也可以将其放在一个查询中:
SELECT EXTRACT(year FROM dtstamp),
MAX(dtstamp) FILTER (WHERE temperature < 0 AND EXTRACT(month FROM dtstamp) < 7) as latest_spring_frost,
MIN(dtstamp) FILTER (WHERE temperature < 0 AND EXTRACT(month FROM dtstamp) >= 7) as earliest_autumn_frost
FROM weather
WHERE temperature < 0
GROUP BY EXTRACT(year FROM dtstamp);
推荐阅读
- java - 为什么 Android Studio 构建找不到符号变量 MockPackageManager?
- ios - performSegue 不工作并导致崩溃
- bash - 如何使用 bash 脚本递归地将 S3 中的文件从文件夹复制到另一个文件夹?
- java - java语句的范围
- apache-kafka - SQS 风格的分布式延迟队列,但在 AWS 之外?
- regex - Regex 根据 Regex 将字符串拆分为 N 个匹配项
- python - 如何保存 Fbo 以用作画布的纹理?
- php - 如何在 IIS 服务器上获取有效的 DOCUMENT_ROOT 值?
- python - 打印 json 元素会导致 TypeError:列表索引必须是整数,而不是 str
- python - 为对象检测实现自定义损失函数