Как проверить, имеет ли столбец все увеличивающиеся значения в PostgreSQL - PullRequest
0 голосов
/ 15 декабря 2018

Как я мог, в идеале с 1 сканированием таблицы, определить, имеет ли столбец все увеличивающиеся значения.то есть: 1, 2, 5, 6, 8, 10, 12, ...

нужна ли пользовательская функция?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Я предлагаю выражение EXISTS в сочетании с оконной функцией (lead() или lag()) в подзапросе.EXISTS прекратит сканирование, как только будет найдена первая строка, что может быть существенно быстрее для больших таблиц:

SELECT EXISTS (
   SELECT FROM (SELECT col, lead(col) OVER (ORDER BY id) AS next_col FROM tbl) t
   WHERE  col >= next_col
   OR     col IS NULL
  );

id - столбец, определяющий порядокстроки.

Если ваше условие выполнено ( "столбец имеет все возрастающие значения" ), он возвращает FALSE.

Пока столбец не определен NOT NULLтакже исключите NULL значения, которые всегда будут нарушать ваше условие.

0 голосов
/ 15 декабря 2018

Можно использовать lag() или lead() и агрегацию:

select (case when bool_and(col > prev_col) then 'increasing'
             else 'not increasing'
         end)
from (select t.*, lag(col) over (order by ?) as prev_col
      from t
     ) t
where prev_col is not null;

Обратите внимание, что ? для столбца в таблице, который определяет порядок строк.Таблицы SQL представляют неупорядоченные наборы, поэтому такой столбец необходим для того, чтобы ваш вопрос имел смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...