sql - 根据PostgreSQL中的条件删除数组中的元素
问题描述
使用版本 12。
我有一个返回日期数组的查询。我正在尝试获取一个返回数组但删除第一个和最后一个日期以及星期二或星期四的任何日期的查询。
这是它的样子:
select my_dates from my_table
{'2019-11-01','2019-11-02','2019-11-03','2019-11-04','2019-11-05','2019-11-06','2019-11-07','2019-11-08','2019-11-09','2019-11-10','2019-11-11','2019-11-12','2019-11-13','2019-11-14','2019-11-15','2019-11-16','2019-11-17','2019-11-18'}
{'2019-10-09','2019-10-10','2019-10-11'}
{'2019-11-04','2019-11-05','2019-11-06','2019-11-07','2019-11-08','2019-11-09','2019-11-10','2019-11-11','2019-11-12','2019-11-13','2019-11-14','2019-11-15','2019-11-16','2019-11-17','2019-11-18','2019-11-19','2019-11-20','2019-11-21','2019-11-22','2019-11-23','2019-11-24','2019-11-25'}
{'2020-02-06','2020-02-07','2020-02-08','2020-02-09','2020-02-10','2020-02-11','2020-02-12','2020-02-13','2020-02-14','2020-02-15','2020-02-16','2020-02-17','2020-02-18','2020-02-19','2020-02-20','2020-02-21','2020-02-22','2020-02-23','2020-02-24','2020-02-25','2020-02-26','2020-02-27','2020-02-28','2020-02-29','2020-03-01','2020-03-02','2020-03-03'}
{'2020-01-30','2020-01-31','2020-02-01','2020-02-02','2020-02-03','2020-02-04','2020-02-05','2020-02-06','2020-02-07','2020-02-08','2020-02-09','2020-02-10','2020-02-11','2020-02-12','2020-02-13','2020-02-14','2020-02-15','2020-02-16','2020-02-17','2020-02-18','2020-02-19','2020-02-20','2020-02-21','2020-02-22','2020-02-23','2020-02-24','2020-02-25'}
所以我正在寻找的查询应该为第一行返回以下内容:
{'2019-11-02','2019-11-03','2019-11-04','2019-11-06','2019-11-08','2019-11-09','2019-11-10','2019-11-11','2019-11-13','2019-11-15','2019-11-16','2019-11-17'}
它从中删除了以下日期元素:
'2019-11-01' -- first element
'2019-11-18' -- last element
'2019-11-05' -- tuesday
'2019-11-07' -- thursday
'2019-11-12' -- tuesday
'2019-11-14'-- thursday
解决方案
你是一个 unnest 和 re-aggregate。日期似乎是有序的,所以:
select (select array_agg(dte order by dte)
from (select dte, min(dte) over () as min_dte,
max(dte) over () as max_dte
from unnest(my_dates) dte
) dte
where dte not in (min_dte, max_dte) and
extract(dow from dte) not in (2, 4)
) as new_my_dates
from my_table;
注意:如果日期没有排序并且您确实希望删除第一个和最后一个元素,那么您可以使用unnest() with ordinality
.
推荐阅读
- windows - 无法在 Window 8 上切换 Docker 操作系统
- scala - Scala REPL 中的斯坦福 CoreNLP 阿拉伯语解析器
- c++ - 在 Eclipse 的命令提示符窗口上运行 C++ 代码
- javascript - Vue SPA - 如何在浏览器中呈现时隐藏 .vue 文件
- excel - 在 Excel 中将日期和时间文本转换为日期和时间格式
- vue.js - vscode自动为vue html元素添加换行符
- kubernetes - Kubernetes API 服务器无法通过 IP 地址从外部访问
- webpack - 使用 webpack 包支持 html 中的 require("module-name")
- c++ - 将类方法作为 void 函数指针传递 (C++11)
- css - 如何在移动视图上调整背景颜色(具体案例)