【问题标题】:Mysql detect doublon with order by dateMysql按日期顺序检测doublon
【发布时间】:2017-06-12 06:17:06
【问题描述】:

我对此请求有疑问: SELECT COUNT() AS nbr_doublon, tel, dateippo FROM vici GROUP BY tel HAVING COUNT() > 1

我想得到这个结果:

^结果将仅包含已尝试日期的副本 请帮忙

-------------- 表格数据

id  tel            dateippo     status  lead_id 
1   11111111111     2017-01-02  ok      4   y
2   11111111111     2017-01-26  na      5   y
3   11111111111     2017-01-28  rep     4   n
4   22222222222     2017-01-10  ok      7   y

我想要的结果:

id  tel             dateippo    status  lead_id 
1   11111111111     2017-01-02  ok      4   
4   22222222222     2017-01-10  ok      7   

首先测试状态是否等于“ok”并按 dateippo 订购 否则按日期订购

求帮助

【问题讨论】:

    标签: mysql group-by duplicates


    【解决方案1】:

    假设您想为每个电话获取具有最大 id 的行,请使用:

    select
        t.*
    from vici t
    inner join (
        select tel, max(id) id
        from vici
        group by tel
    ) t2 on t.tel = t2.tel
    and t.id = t2.id;
    

    编辑 1:

    如果它基于 dateippo,只需将 id 替换为 dateippo,如下所示:

    select
        t.*
    from vici t
    inner join (
        select tel, max(dateippo) dateippo
        from vici
        group by tel
    ) t2 on t.tel = t2.tel
    and t.dateippo = t2.dateippo;
    

    编辑 2:

    首先按状态 = 'ok' 排序,然后按日期排序,

    select
        t.*
    from vici t
    inner join (
        select tel, max(id) id
        from vici
        group by tel
    ) t2 on t.tel = t2.tel
    and t.id = t2.id
    order by t.status <> 'ok', t.dateippo;
    

    编辑 3:

    select
        t.*
    from vici t
    inner join (
        select 
            tel,
            case when count(status = 'ok') > 1 then 
                max(case when status = 'ok' then dateippo end) 
            else max(dateippo) end dateippo
        from vici
        group by tel
    ) t2 on t.tel = t2.tel
    and t.dateippo = t2.dateippo;
    select * from vici;
    

    或基于id:

    select
        t.*
    from vici t
    inner join (
        select 
            tel,
            case when count(status = 'ok') > 1 then 
                max(case when status = 'ok' then id end) 
            else max(id) end id
        from vici
        group by tel
    ) t2 on t.tel = t2.tel
    and t.id = t2.id;
    select * from vici;
    
    +------+-------------+------------+--------+---------+
    | id   | tel         | dateippo   | status | lead_id |
    +------+-------------+------------+--------+---------+
    |    1 | 11111111111 | 2017-01-02 | ok     |       4 |
    |    4 | 22222222222 | 2017-01-10 | ok     |       7 |
    +------+-------------+------------+--------+---------+
    2 rows in set (0.00 sec)
    

    【讨论】:

    • 请提出另一个问题,如果我想添加一个标准,我会解释:首先按状态 = 'ok' 排序,然后按日期排序,我对此进行测试,但他返回一行“选择 t. *来自vici t内部连接(选择tel,max(dateippo)作为来自vici group by tel的dateippo)t2 on t.tel = t2.tel AND cloturee = 'y' and t.dateippo = t2.dateippo AND status = 'ok '"
    • @MoHamedNejjAr - 查看最后一个查询
    • thnx 进行回复,它的工作但并不完美:它返回 2 行,其中一行 status = 'ok' ,一行带有 date 尝试 desc 但 status = 'rep',我想要结果如果 status = 'ok' 返回重复数据,否则按日期返回重复数据顺序
    • @MoHamedNejjAr 请在问题中将示例数据和您的预期输出作为文本表(不是图像)发布以澄清
    • 谢谢你......完美地工作......我会将它改编为我的数据库产品......?
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多