установка новых значений столбца для группы на основе условия в SQL - PullRequest
0 голосов
/ 27 февраля 2019

Я недавно начал работать с sql, и я работаю над таблицей с 3 столбцами.Таблица выглядит следующим образом:

| indv | number | flag |
|:----:|:------:|:----:|
| 2477 |  7612  |   1  |
| 2477 |  7850  |   0  |
| 2477 |  7862  |   0  |
| 2477 |  7952  |   1  |
| 2477 |  8150  |   0  |
| 2477 |  8280  |   0  |
| 2477 |  8301  |   1  |
| 2560 |  7612  |   0  |
| 2560 |  7850  |   0  |
| 2560 |  7862  |   0  |
| 2877 |  3422  |   1  |
| 2877 |  3423  |   1  |
| 2877 | 5612   |  1   |
| 2877 | 6123   |  1   |

Я хочу написать запрос, который создает новый столбец на основе группировки по значениям indv и значениям во флаге.Как, например, для группы 2477 новый столбец номер 1 создается так, что его значение равно номеру по умолчанию (скажем, 10000), если флаг равен 0 для каждой записи в группе, но равен первому значению группы, если флаг равен 1.Однако если разница между числом для 2 последовательных флагов = 1 больше 50, тогда столбец number1 должен иметь значение, соответствующее последнему значению flag = 1 в столбце номера.Это может показаться запутанным, поэтому также предоставили пример вывода:

| indv | number | flag | number1 |
|:----:|:------:|:----:|---------|
| 2477 |  7612  |   1  | 7612    |
| 2477 |  7850  |   0  | 7612    |
| 2477 |  7862  |   0  | 7612    |
| 2477 |  7952  |   1  | 7952    |
| 2477 |  8150  |   0  | 7952    |
| 2477 |  8280  |   0  | 7952    |
| 2477 |  8301  |   1  | 8301    |
| 2560 |  7612  |   0  | 10000   |
| 2560 |  7850  |   0  | 10000   |
| 2560 |  7862  |   0  | 10000   |
| 2877 |  3422  |   1  | 3422    |
| 2877 |  3423  |   1  | 3422    |
| 2877 | 5612   |  1   | 5612    |
| 2877 | 6123   |  1   | 6123    |  

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете использовать коррелированный подзапрос:

select t.*,
       coalesce((select t1.number
                 from table t1 
                 where t1.indv = t.indv and t1.number <= t.number and t1.flag = 1 
                 order by t1.number desc
                 limit 1
                ), 10000
               ) as number1
from table t; 

Разные базы данных имеют разный вид для ограничения строк, поэтому вам необходимо соответствующим образом изменить subquery.

...