【问题标题】:SQL add same contentsSQL添加相同的内容
【发布时间】:2022-01-12 21:33:48
【问题描述】:

如何删除所有重复且没有最大“数量”的列。我有下表:

ID           TIME            AMOUNT
-----------------------------------
1              x                5
2              y                1
2              y                3
3              z                1
3              z                2
3              z                3

但我希望它是这样的,这样只有数字最大的列才能“存活”:

ID           TIME            AMOUNT
------------------------------------
1              x                5
2              y                3
3              z                3

我该怎么做?

【问题讨论】:

  • 如果两行有相同的 id 和 ammount 怎么办?
  • 我怎样才能删除所有列大概你的意思是

标签: mysql sql


【解决方案1】:

您可以获取每个 id 和 time 的最大数量,然后获取匹配的行:

select t.Id, t.Time, t.amount
from myTable t 
inner join 
    (select Id, time, max(amount) as amt
     from myTable
     group by Id, Time) tmp on t.id = tmp.id and
                            t.time = tmp.time and
                            t.amount = tmp.amt

DbFiddle demo

编辑:您可能需要根据需要添加 DISTINCT。

【讨论】:

    【解决方案2】:

    使用 CTE 的另一种方法

    with del as (
      select *, 
        First_Value(amount) over(partition by id order by amount desc) maxamount
      from t
    )
    delete from t
    using t join del on t.id = del.id and t.amount < maxamount;
    

    【讨论】:

      【解决方案3】:
      WITH cte AS 
      (
          SELECT 
              ID, 
              ROW_NUMBER() OVER (PARTITION BY TIME ORDER BY AMOUNT DESC) AS ROWNUM
          FROM 
              MyTable
      )
      DELETE MyTable 
      FROM MyTable 
      JOIN cte USING (ID)
      WHERE ROWNUM > 1;
      

      WITH syntax 需要 MySQL 8.0。

      【讨论】:

        【解决方案4】:

        我认为这里的一些答案过于复杂。

        delete t 
        from yourtable t 
        join yourtable t2 on t.id = t2.id 
                          and t.time = t2.time 
                          and t2.amount > t.amount
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多