I’m trying to update a column Product_Group
from a column called Product
in the same table. This Product
column has two entries, Simple
or Others
. i.e shown below in Invoice
table:
The issue I’m have is that if you look at Top_Level ID 10, 19, 21 and 31 has multiple entries and the Product are multiple as well (i.e Simple and Others).
What I want to achieve is that when I see Top_Level who has Simple and Others then update Product_Group Column to “Simple/Other”
How can I achieve this?
Advertisement
Answer
You have only two groups, so you can use window functions, min()
and max()
:
select i.*, (case when min(product) over (partition by top_level) = max(product) over (partition by top_level) then product else 'Other/Simple' end) as product_group from invoices i;
You would want to use min(product) over (partition by top_level)
if product
could ever be NULL
.
This approach does not generalize (easily) to more than two groups. But it should work well in this situation.
EDIT:
If you actually want to update the column, just use a CTE:
with toupdate as ( select i.*, (case when min(product) over (partition by top_level) = max(product) over (partition by top_level) then product else 'Other/Simple' end) as new_product_group from invoices i ) update toupdate set product_group = new_product_group;