Given the following table:
id value ------- ------- 0 1 1 6 2 7 3 9 4 2 5 20 6 21 7 3
I’m wondering if there’s a way to select distinct rows where there’s a difference between (integer) values of (for example) 3, giving a priority to id (low id value = more prioririty). Programmatically, I would iterate over values starting from id=0 and discarding rows where value, compared to my current list, has a difference less than 3. Here follows an example in C to give an idea:
x
std::vector<int> filtered_values;
for (int i=0; i<values.size();i++)
{
bool update = true;
for (int j=0; j<filtered_values.size();j++)
{
if (abs(filtered_values[j]-values[i]) < 3) {
update = false;
break;
}
}
if (update)
filtered_values.push_back(values[i]);
}
Is it possible to do this filtering in SQL?
The result, given the initial table, would be:
id value ------- ------- 0 1 1 6 3 9 5 20
Advertisement
Answer
You can do it with a recursive CTE:
with recursive cte as (
select id, value from tablename
where id = 0
union all
select t.id, t.value
from cte c inner join tablename t
on t.id = (select min(id) from tablename where id > c.id and value - c.value >= 3)
)
select * from cte
See the demo.
Results:
| id | value |
| --- | ----- |
| 0 | 1 |
| 1 | 6 |
| 3 | 9 |
| 5 | 20 |