SQL:在 MySQL/MariaDB 中选择具有窗口函数的某些行

Posted

技术标签:

【中文标题】SQL:在 MySQL/MariaDB 中选择具有窗口函数的某些行【英文标题】:SQL: Select certain rows with window functions in MySQL/MariaDB 【发布时间】:2020-12-08 22:51:37 【问题描述】:

我的问题可以简化为下面的例子:

create table dsort(dfrom date,dto date,pname varchar(10));
insert into dsort(dfrom,dto,pname) values(20180101,20180101,'Anja');
insert into dsort(dfrom,dto,pname) values(20190101,20191231,'Fred');
insert into dsort(dfrom,dto,pname) values(20190201,20190201,'Willy');
insert into dsort(dfrom,dto,pname) values(20190301,20190301,'John');
insert into dsort(dfrom,dto,pname) values(20191230,20200131,'Sepp');
insert into dsort(dfrom,dto,pname) values(20200201,20200202,'Leo');

现在我正在寻找一个 sql 语句,它选择所有行(按dfrom 排序)具有dfrom 不在任何先前选择的行的dfromdto 之间,可能使用窗口函数来获取其他行的信息,如下所示:

select dfrom,dto,pname from ...

导致:

dfrom          dto       pname
20180101       20180101  'Anja'
20190101       20191231  'Fred'
20200201       20200202  'Leo'

谁能给我必要的sql语句?

【问题讨论】:

【参考方案1】:

我认为最简单的方法是not exists:

select d.*
from dsort d
where not exists (
    select 1
    from dsort d1
    where d.dfrom > d1.dfrom  and d.dfrom < d1.dto
)

【讨论】:

是的,对于我的简化示例,这是一个很好的解决方案。实际上,dsort 代表一个巨大的选择语句,其中包含多个我不喜欢调用两次的联合,但如果我像在您的解决方案中那样输入两次,优化器可能不会真正调用它两次? @GeraldSchade:如果没有看到您的实际查询,很难判断。一个想法:您可以将现有查询放入 CTE:with dsort as (-- your big query --) select -- the above query -- 谢谢,就是这样! (在您的代码中,应将 d.from 更正为 d.dfrom)

以上是关于SQL:在 MySQL/MariaDB 中选择具有窗口函数的某些行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL/MariaDB 中创建与 root 具有相同权限的用户? [关闭]

MySQL学习记录

linux架构学习第二十八天之Mysql/MariaDB数据库入门

MySQL

无法从 information_schema (MySQL/MariaDB) 访问列名

[SQL] 0x00 初识SQL 及 MySQL/MariaDB 安装