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
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
);
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.