Say I have two columns in a table, a and b. For each value of a, there can be zero-to-many values of b. If the columns are sorted by a, then by b, what is the most efficient way to mark the first value of b which is greater than the corresponding value of a in a new third column? See simplified example below.
Initial Table
| a | b | 
|---|---|
| 10 | 8 | 
| 10 | 10 | 
| 10 | 11 | 
| 10 | 14 | 
| 20 | 22 | 
| 20 | 25 | 
| 30 | 25 | 
| 30 | 28 | 
Desired Modified Table
| a | b | first_greater | 
|---|---|---|
| 10 | 8 | 0 | 
| 10 | 10 | 0 | 
| 10 | 11 | 1 | 
| 10 | 14 | 0 | 
| 20 | 22 | 1 | 
| 20 | 25 | 0 | 
| 30 | 25 | 0 | 
| 30 | 28 | 0 | 
Advertisement
Answer
You don’t suggest a specific RDBMS but I would think the following is not too inneficient, using a simple window function and conditional case.
select a, b,
    case when b > a
      and Row_Number() 
         over (partition by a, case when b > a then 1 end order by b)=1
     then 1 else 0 
   end as first_greater
from t