SQL: как выбрать отдельные значения со смещением - PullRequest
0 голосов
/ 31 января 2020

Учитывая следующую таблицу:

id      value     
------- -------
0       1      
1       6      
2       7      
3       9      
4       2      
5       20     
6       21      
7       3  

Мне интересно, есть ли способ выбрать отдельные строки, где есть разница между (целочисленными) значениями (например) 3, давая приоритет id (низкое значение id = больше приоритета). Программно, я бы перебрал значения, начиная с id = 0 и отбрасывая строки, где значение, по сравнению с моим текущим списком, имеет разницу меньше 3. Вот пример из C, чтобы дать идею:

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]);
}

Возможно ли выполнить эту фильтрацию в SQL?

Результат, учитывая исходную таблицу, будет:

id      value     
------- -------
0       1      
1       6
3       9      
5       20 

1 Ответ

0 голосов
/ 31 января 2020

Вы можете сделать это с помощью рекурсивного 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 

См. Демоверсию . Результаты:

| id  | value |
| --- | ----- |
| 0   | 1     |
| 1   | 6     |
| 3   | 9     |
| 5   | 20    |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...