我的表结构和一些示例数据(测试表),以及我想要的输出(结果)都可以在这里找到。
当我做
SELECT distinct colony, min(date_check), max(date_check)
from test
where protection ='Y'
group by colony
我只按菌落检测 1 个事件。
我应该使用函数还是有其他方法?
ps:如果你想到一个更好的标题来帮助用户,不要犹豫,我在挣扎。
我的表结构和一些示例数据(测试表),以及我想要的输出(结果)都可以在这里找到。
当我做
SELECT distinct colony, min(date_check), max(date_check)
from test
where protection ='Y'
group by colony
我只按菌落检测 1 个事件。
我应该使用函数还是有其他方法?
ps:如果你想到一个更好的标题来帮助用户,不要犹豫,我在挣扎。
没有 CTE 和窗口函数:
使用 CTE 和窗口函数:
https://dbfiddle.uk/?rdbms=postgres_9.5&fiddle=bf769987d7211b73e89c0564bc6902a5
为了解决您的问题,我执行了以下操作(此处提供了以下所有代码的小提琴):
几点:
此解决方案使用LAG()窗口函数。
窗口函数非常强大,并且会回报您多次学习它们所付出的努力。
最后,PostgreSQL 9.5 不再受支持——您最好转向受支持的版本。
第一步:
我们获得了菌落或保护发生变化的点。
结果(为简洁起见):
第2步:
我们对变化进行汇总,获得保护 = 'Y' 的每个开始和停止日期的不同记录。
结果:
第 3 步:
最后,我们得到
check_date
从“N”到“Y”(反之亦然)变化的 MIN() 和 MAX(),但只取那些 whereprotection
= 'Y'。结果:
量子点
窗口函数解决方案似乎是性能最高的 - 请参阅此处- 多次运行小提琴并改变查询的顺序......我尝试在运行之前预热缓存,
EXPLAIN (ANALYZE...)
但使用您自己的表进行测试和硬件...