如何通过比较 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' < '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 中的图表生成 SQL 脚本?
如何将MySql Workbench中的表格数据导出为csv?
如何以通过 ed25519 识别的用户身份使用 MYSQL Workbench 连接到 MariaDB (10.5.8)?