【问题标题】:How to filter by comparing the dates in MySQL Workbench如何通过比较 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 很陌生,请帮助...

【问题讨论】:

    标签: mysql sql date datetime greatest-n-per-group


    【解决方案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()
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多