This might be very simple question, but I just can’t come up with a solution.
Here is an example
create table #Example ( Key1 varchar(55) PRIMARY KEY, Key2 varchar(55), Key3 varchar(55), Key4 varchar(55) ) insert into #Example select '1001', '100', NULL, NULL union all select '1002', '100', NULL, NULL union all select '1003', '200', NULL, NULL
Key1 is unique. We set Key3 by using following logic:
with UpdateKey3 as ( select Key1, Key2, ROW_NUMBER() OVER (PARTITION BY Key2 ORDER BY Key1 DESC) as RN from #Example ) update ao set Key3 = m.Key1 from #Example ao inner join UpdateKey3 m ON ao.Key2 = m.Key2 where m.RN = 1
Table looks like this
I want Key4 to be:
Since any particular Key3 grouping has Key4 values all NULL, set it to Key3. Result should be this
Now, assume adding 1 more row:
insert into #Example select '1004', '100', NULL, NULL
And then we run UpdateKey3 query, result would become:
Now, we need to **** query, that will update Key4. Since new row is in Key3 group = 1004, and we already have previously filled Key4 for that group, NULL should become 1002. Final result
Aka, once we set Key4 for any particular Key3 grouping, Key4 should never change. What would be that **** query?
Advertisement
Answer
It’s a little hard to follow, but I think I see what you’re saying:
If key4 is null …
- Try to find another record with the same key3 value, and see what it says for key4.
- If any such record has a key4 value, use it
- Else just use the current record’s key 3 value
With this in mind, to update Key 4, you might want a procedure like this:
update #Example set key4 = isnull( ( -- You have more than one row meeting your criteria. -- Which do you choose. I have a top 1, but order by what? select top 1 key4 from #example sub where #Example.key3 = sub.key3 and sub.key4 is not null ), key3 ) where key4 is null
I stress ‘might’ because your statement (which I translated into the second bullet above):
Since new row is in Key3 group = 1004, and we already have previously filled Key4 for that group, NULL should become 1002.
doesn’t take into consideration the possibility that two previously existing key 3 groups of 1004 might have different key 4 values. Yes, in your example they’re both 1002, but in the future they won’t always be.
You’ll have to choose between one of them, and it’s not clear which one to choose. You’ll really have to nail that down before you put any such code into production.