简体   繁体   中英

SQL: Update with minimum value from maximum value

I am struggling to update a column in myTable via VB and 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

I want to update column value3 with value2 where value2 is lowest when value1 is highest in group.

I have this:

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

I get this:

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

But I need this:

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

I need something like "UPDATE mytable SET Value3 = MIN(value2) WHERE MAX(value1) GROUP BY myGroup"

myTabel should be like:

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

Any help please.

You might use a query like :

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

and with respect to the above SELECT statement, the UPDATE statement might be :

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

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

One method is a correlated subquery. Something like this:

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;

This uses ANSI/ISO syntax. The specific syntax might vary for your database.

This can also be expressed using the standard function first_value() :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM