I have a table defined as :
| Entity | Version | Value1 | Value2 |
|---|---|---|---|
| a | current | null | null |
| a | last_year | 50 | 100 |
| b | current | 25 | 100 |
| c | current | 40 | 100 |
| c | last_year | null | null |
| d | current | 50 | 100 |
| d | last_year | 55 | 200 |
I want to extract Value1 and Value2 for each entity whenever there is a value but preference for 'Version = Current'. So, for the above example, the answer should be:
| Entity | Version | Value1 | Value2 |
|---|---|---|---|
| a | last_year | 50 | 100 |
| b | current | 25 | 100 |
| c | current | 40 | 100 |
| d | current | 50 | 100 |
CodePudding user response:
This is a typical use-case for row_number, the only complication being the ordering criteria.
Assuming You want rows with both values being null to have the lowest rank, try the following:
select Entity, Version, Value1, Value2
from (
select *,
Row_Number() over(partition by entity
order by
case when Concat(value1,value2) = '' then 1 else 0 end,
version) rn
from t
)t
where rn = 1;
See Demo Fiddle
