【问题标题】:update only records with a max value using group by使用 group by 仅更新具有最大值的记录
【发布时间】:2014-02-24 20:02:09
【问题描述】:

我有一些数据,只要 server_id、product_id 和 polled_at 日期匹配,我想将 updated_by 设置为 2(仅搜索更新者已经为 1 的行)。我一直在弄乱我的代码,但无法弄清楚。请帮我。这就是我所拥有的。

http://sqlfiddle.com/#!2/ebd112/1

前 2 行不应更新,只有 server_id、product_id 和 polled_at 匹配的所有其他行之间的最大峰值应更新为 updated_by=2

谢谢

【问题讨论】:

  • 所以您只想在这种情况下更新licenses_peak = 30 的记录?
  • 我只想更新 updated_by=1 的记录,如果重复记录的峰值最大,则将其设置为 2

标签: mysql group-by max having-clause


【解决方案1】:

您需要在查询中添加 HAVING 子句。这是更新的小提琴: http://sqlfiddle.com/#!2/9e3a9/1

基本上,我没有像最初那样尝试对其进行排序,而是将ORDER BY 更改为HAVING 子句:

HAVING licenses_peak = (SELECT Max(licenses_peak) FROM hpolls WHERE updated_by=1)

这将导致查询仅包括那些在该分组中具有最大 licenses_peak 值的项目。

【讨论】:

  • 这不是我需要的。我想更新所有记录(除了updated_by=0),如果重复的server_id、product_id和polled_at的峰值更大,则只将updated_by设置为2。
  • 我想我不明白你的问题。我发布的那个小提琴正是这样做的......你列表中的哪些项目应该更新?
  • 我使用它来工作: UPDATE hpolls set updated_by=2 where id in ( SELECT id FROM (select * from hpolls where updated_by=1 order by licenses_peak desc) as sub GROUP BY server_id, product_id, polled_at);
  • 这似乎行不通,除非您将其设为SELECT TOP 1 id FROM ...,否则它仍将更新您所有具有updated_by=1 的记录。仅按 licenses_peak 降序排序本身不会做任何事情,您必须指定要查询返回多少条记录,在本例中为子查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2021-07-20
  • 2012-12-14
  • 2022-08-11
  • 2020-12-19
  • 2021-01-20
相关资源
最近更新 更多