【问题标题】:SQL: Update with minimum value from maximum valueSQL:从最大值更新最小值
【发布时间】:2019-03-12 11:44:54
【问题描述】:

我正在努力通过 VB 和 OleDB 更新 myTable 中的列。

我的表:

myGroup  Value1  Value2
A          20       5
B          15       3
A          19       4
A          20       6
C          10       2
B          14       4
C          11       7

我想用 value2 更新列 value3,其中 value1 在组中最高时 value2 最低。

我有这个:

SELECT myGroup ,MAX(value1), MIN(value2)
FROM myTable
GROUP BY myGroup

我明白了:

myGroup  Value1  Value2
A          20       4
B          15       3
C          11       2

但我需要这个:

myGroup  Value1  Value2
A          20       5
B          15       3
C          11       7

我需要类似“UPDATE mytable SET Value3 = MIN(value2) WHERE MAX(value1) GROUP BY myGroup”

myTabel 应该是这样的:

myGroup  Value1  Value2  Value3
A          20       5       5
B          15       3       3
A          19       4       5
A          20       6       5
C          10       2       7
B          14       4       3
C          11       7       7

请帮忙。

【问题讨论】:

  • 你用的是什么数据库?
  • 这是一个 mdb 数据库

标签: sql ms-access oledb


【解决方案1】:

您可以使用如下查询:

SELECT t1.myGroup, t1.value1, t2.value2 as value3
  FROM myTable t1
  LEFT JOIN
(
SELECT myGroup, Value1, MIN(VALUE2) AS value2
  FROM myTable
 WHERE (myGroup, Value1) in
  (
   SELECT myGroup , MAX(value1)
     FROM myTable
    GROUP BY myGroup
  ) 
 GROUP BY myGroup, Value1) t2 
    ON ( t1.myGroup = t2.myGroup );

myGroup Value1  Value3
------- ------  ------
    A     20      5
    B     15      3
    A     19      5
    A     20      5
    C     10      7
    B     14      3
    C     11      7

Rextester Demo for Select

对于上面的 SELECT 语句,UPDATE 语句可能是:

UPDATE myTable t3
   SET t3.Value2 =
            ( SELECT q.value3 FROM 
              (
                SELECT t1.myGroup, t1.value1, t1.value2, t2.value2 as value3
                  FROM myTable t1
                  LEFT JOIN
                (
                SELECT myGroup, Value1, MIN(VALUE2) AS value2
                  FROM myTable
                 WHERE (myGroup, Value1) in
                  (
                   SELECT myGroup , MAX(value1)
                     FROM myTable
                    GROUP BY myGroup
                  ) 
                 GROUP BY myGroup, Value1) t2 
                    ON ( t1.myGroup = t2.myGroup )
               ) q
               WHERE q.myGroup = t3.myGroup 
                 AND q.value1 = t3.value1
                 AND q.value2 = t3.value2
              );  

Rextester Demo for Update

【讨论】:

    【解决方案2】:
    select t.myGroup as myGroup ,value1,min(t.value2) as min2
    
    from stack t
    
    join (select myGroup,max(value1) as max_value1
    
    from stack
    
    group by myGroup) max1_table
    
    on t.myGroup=max1_table.myGroup and t.value1=max1_table.max_value1
    
    group by myGroup,value1
    

    【讨论】:

    • 谢谢。这可行,但我如何在更新查询中实现它? ea "UPDATE mytable SET Value3 = ..."
    • @Robert,您不应该将可计算的数据存储在表中。只需使用查询。
    【解决方案3】:

    一种方法是相关子查询。像这样的:

    select t.*,
           (select t2.value2
            from t t2
            where t2.mygroup = t.mygroup
            order by value1 desc, value2 asc
            fetch first 1 row only
           ) as value3
    from t;
    

    这使用 ANSI/ISO 语法。具体语法可能因您的数据库而异。

    这也可以用标准函数first_value()来表达:

    select t.*,
           first_value(value2) over (partition by mygroup order by value1 desc, value2 asc) as value3
    from t;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 2015-11-10
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      相关资源
      最近更新 更多