【问题标题】:How to achieve row number functionality in mysql 5.7?如何在 mysql 5.7 中实现行号功能?
【发布时间】:2020-05-20 11:53:04
【问题描述】:

表名:table_one 列:(idref_id时间戳

| **id** | **ref_id** |    **timestamp**       |                              
| 1      | 111        | 2020-04-27 02:59:45    |           
| 2      | 111        | 2020-04-28 02:59:45    |            
| 3      | 111        | 2020-04-26 02:59:45    |

我想实现类似的东西

DELETE 
FROM   (
           SELECT *,
                  ROW_NUMBER() OVER(PARTITION BY red_id ORDER BY TIMESTAMP DESC) AS rn
           FROM   table_one
       ). 
       s
WHERE  r.rn != 1; 

执行上述删除查询后的表 table_one 应该是这样的

| **id** | **ref_id** |    **timestamp**                                               
| 2      | 111        | 2020-04-28 02:59:45    |  

我已尝试选择删除所需的行,但未获得正确的行号。请在下面找到我的查询:

SET @row_number : = 0;   
SELECT *
FROM   (
           SELECT @row_number: = CASE 
                                      WHEN @ci = ref_id THEN @row_number + 1
                                      ELSE 1
                                 END  AS rn,
                  @ci: = ref_id          ref_id,
                  id,
                  TIMESTAMP
           FROM   table_one
           ORDER BY
                  TIMESTAMP              DESC 

提前致谢。

【问题讨论】:

    标签: mysql sql mysql-5.7


    【解决方案1】:
    DELETE t1.*
    FROM table_one t1, table_one t2
    WHERE t1.ref_id = t2.ref_id 
      AND t1.`timestamp` < t2.`timestamp`
    

    或在 JOIN 语法中相同

    DELETE t1.*
    FROM table_one t1
    JOIN table_one t2 ON t1.ref_id = t2.ref_id 
    WHERE t1.`timestamp` < t2.`timestamp`
    

    fiddle

    【讨论】:

    • 请在粘贴之前测试查询
    • @Strawberry 这些查询有什么问题?小提琴添加 - 检查。 PS。 extended fiddle version.
    • 道歉。我的立场是正确的 - 我认为您不能在 DELETE 中包含 * !!!当然,这样做是没有意义的,但这不是重点。
    • @Strawberry 我认为你不能在 DELETE 中包含 * 它是可选的,可以很容易地跳过 (DELETE t1 FROM ...) - 但我已经习惯了,手自动书写。
    【解决方案2】:

    使用join:

    delete t
        from table_one t join
             (select tt.ref_id, max(tt.timestamp) as max_ts
              from table_one tt
              group by tt.ref_id
             ) tt
             on tt.ref_id = t.ref_id
        where t.timestamp < tt.max_ts;
    

    这个不需要窗口函数。

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多