【问题标题】:SQL Set column with Key and max value from other columSQL 使用另一列的键和最大值设置列
【发布时间】:2021-12-03 18:35:37
【问题描述】:

我需要根据同一 ID 的“持续时间”列的最大值更新“max_register”列,设置值 = 1,其他值 = 0。

初始表:

Id | duration | max_register
1  |  0       | 0
1  |  7       | 0
1  |  3       | 0
2  |  10      | 0
2  |  5       | 0
2  |  0       | 0
3  |  6       | 0
3  |  5       | 0
3  |  0       | 0

结束表:

Id | duration | max_register
1  |  0       | 0
1  |  7       | 1
1  |  3       | 0
2  |  10      | 1
2  |  5       | 0
2  |  0       | 0
3  |  6       | 1
3  |  5       | 0
3  |  0       | 0

这是一个临时表,有数千个寄存器。所以我不知道是否需要使用光标或类似的东西。

【问题讨论】:

  • 你使用的是 mysql 8 还是更早的版本?
  • 什么是时态表?你是说临时表吗?
  • 我使用的是 SQL 2017

标签: sql sql-server-2017 database-cursor temporal


【解决方案1】:

在 mysql 5.7+ 中:

update tablename t1
set max_register = 1
where (id, duration)  = ( 
                          select id, duration 
                          from tablename t2
                          where t1.id = t2.id 
                          order by t2.duration limit 1
)

在 sql server 中,如果你有一个日期列,你可以使用这个查询:

update  t
set max_register = 1
from ( 
   select max_register , row_number() over (partition by id order by duration desc, dateCol desc) rn 
   from tablename
) t where  t.rn = 1 

【讨论】:

  • 这个不错的解决方案并没有错,更多的是业务决策/规则:在出现关系的情况下会发生什么 - 一组中的两条记录最长持续时间为 5?可能需要运行一个业务决策规则来清理关系并在标记它之前选择一个最大持续时间。
  • @mikeY 用你当前的表结构你不能。你需要在你的表中有一个唯一的键
  • 如果两个或多个记录具有相同的值,使用的第二个过滤器是基于另一个名为“日期”的列,取更多的数据。
  • @eshirvana 这不是我的数据,我也不是 OP。我只是想指出,如果 OP 有两个 ID 为 3 的记录,每个记录的持续时间值为 6,那么 OP 将需要准备好处理这个问题。 OP 似乎有一个我们看不到的日期字段来处理事情。
  • @mikeY 抱歉,我以为是你的问题
猜你喜欢
  • 2020-07-07
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2018-08-25
  • 2021-10-16
相关资源
最近更新 更多