【问题标题】:Random Rows Delete随机行删除
【发布时间】:2020-10-06 19:13:30
【问题描述】:

我需要删除一行并根据ColumnName 的顺序保留接下来的两行

╔═════╦═════════════╦═══════╦════════════╦════════╗
║ ID  ║ Description ║ Value ║    Date    ║ Number ║
╠═════╬═════════════╬═══════╬════════════╬════════╣
║ 0x0 ║ Desc        ║   100 ║ 2020/01/01 ║    200 ║
║ 0x0 ║ Desc1       ║   150 ║ 2020/01/01 ║    201 ║
║ 0x0 ║ Desc2       ║    75 ║ 2020/01/01 ║    202 ║
║ 0x0 ║ Desc3       ║    50 ║ 2020/01/01 ║    500 ║
║ 0x0 ║ Desc4       ║    55 ║ 2020/01/01 ║    505 ║
║ 0x0 ║ Desc5       ║   110 ║ 2020/01/01 ║    507 ║
╚═════╩═════════════╩═══════╩════════════╩════════╝

例如,应删除第 202 和 507 行。
有可能吗?

【问题讨论】:

  • 请让我们看看你的尝试。

标签: sql sql-server window-functions sql-delete sql-server-2017


【解决方案1】:

是的,您可以对行编号,然后将其删除。对此要非常小心。我当然不建议经常使用这种技术。

with data as (
    select *, row_number() over (order by Number) as rn from T
)
delete from data
where rn % 3 = 0;

请注意,row_number() 将以 1 而不是 0 开头。

【讨论】:

    【解决方案2】:

    如果要删除整个表中的三行中的一行,可以使用row_number() 和一个可更新的 CTE:

    with cte as (
        select row_number() over(order by number) rn
        from mytable
    )
    delete from cte where rn % 3 = 0
    

    row_number() 枚举从1 开始的最小的number 行;然后,外部查询每三行删除一次。对于您的示例数据,这将删除带有 numbers 202 和 507 的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多