如何通过比较 MySQL Workbench 中的日期进行过滤

Posted

技术标签:

【中文标题】如何通过比较 MySQL Workbench 中的日期进行过滤【英文标题】:How to filter by comparing the dates in MySQL Workbench 【发布时间】:2020-08-18 22:45:33 【问题描述】:

我有一张像这样的表格:

ID   B     C      date01        date02       date03
11  xxx   xxxx   2020-05-01    2020-05-02   2020-06-02
11  xxx   xxxx   2020-06-01    2020-06-03   2020-05-02
11  xxx   xxxx   2020-07-01    2020-07-03   2020-06-30
11  xxx   xxxx   2020-07-01    2020-06-03   2020-06-30
11  xxx   xxxx   2020-01-01    2020-01-08   2020-05-02
11  xxx   xxxx   2020-02-01    2020-01-31   2020-05-02
22  xxx   xxxx   2020-05-01    2020-05-02   2020-06-02
22  xxx   xxxx   2020-06-01    2020-06-03   2020-05-02
22  xxx   xxxx   2020-07-01    2020-07-03   2020-06-30
22  xxx   xxxx   2020-07-01    2020-06-03   2020-06-30
22  xxx   xxxx   2020-01-01    2020-01-08   2020-05-02
22  xxx   xxxx   2020-02-01    2020-01-31   2020-05-02

我想返回所有内容,但每个 ID 的这三个日期的最新日期,并且 date02 不能晚于 date03,我当前的输出将给我这个 where date02 > date03:

11  xxx   xxxx   2020-07-01    2020-07-03   2020-06-30

预期输出:

11  xxx   xxxx   2020-07-01    2020-06-03   2020-06-30
22  xxx   xxxx   2020-07-01    2020-06-03   2020-06-30

我试过了:

SELECT 
    id,
    B,
    C,
    max(date01),
    max(date02), 
    max(date03),  
FROM 
    table
WHERE
    'date02' < 'date03'
GROUP BY id

我已经添加了WHERE 'date02' &lt; 'date03',但是为什么输出仍然有date02>date03的记录?我对 SQL 很陌生,请帮助...

【问题讨论】:

【参考方案1】:

您可以使用相关子查询和元组相等来做到这一点:

select t.*
from mytable t
where (t.date01, t.date02, t.date03) = (
    select t1.date01, t1.date02, t1.date03 
    from mytable t1 
    where t1.id = t.id
    order by t1.date01 desc, t1.date02 desc, t1.date03 desc
    limit 1
)

为了提高此查询的性能,您可以在 (id, date01, date02, date03) 上创建复合索引。

如果您运行的是 mysql 8.0,您也可以使用row_number()

select *
from (
    select 
        t.*, 
        row_number() over(partition by id order by date01 desc, date02 desc, date03 desc) rn
    from mytable t
) t
where rn = 1

Demo on DB Fiddle

身份证 |乙| C |日期01 |日期02 |日期03 -: | :-- | :--- | :--------- | :--------- | :--------- 11 | xxx | xxxx | 2020-07-01 | 2020-07-03 | 2020-06-30 22 | xxx | xxxx | 2020-07-01 | 2020-07-03 | 2020-06-30

【讨论】:

您好,对于丢失的信息,我很抱歉,我使用的是 Workbench 6.3 CE,还有一个关于您的回答 select t1.date01, t1.date02, t1.date03 的快速问题,t1 您的意思是 t 我正在尝试第一段代码,现在它显示“正在运行”很长时间,不知道发生了什么。 @Cecilia:如果数据量很大,需要提高性能,可以在(id, date01, date02, date03)上创建复合索引。 @Cecilia:我的意思是t1 写在t1 的地方。请按照提供的方式准确运行查询(您也可以参考我在答案中添加的 db fiddle)。 @Cecilia:6.3 是您的工作台版本。要查看您的 mysql 版本,您可以运行 select version()

以上是关于如何通过比较 MySQL Workbench 中的日期进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Workbench 或 MS Access 更新 MySQL 视图中的数据

如何删除 mysql workbench 8.0 中的检查约束?

MySQL Workbench 从 CSV 导入 NULL

如何从 MySQL Workbench 中的图表生成 SQL 脚本?

如何将MySql Workbench中的表格数据导出为csv?

如何以通过 ed25519 识别的用户身份使用 MYSQL Workbench 连接到 MariaDB (10.5.8)?