Как отфильтровать записи, которые лежат между значениями в предыдущих записях - это пробелы? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть эта таблица:

period_start    period_end  periodelength
202000  202003  4
202001  202004  4
202002  202005  4
202003  202006  4
202004  202007  4
202005  202008  4
202006  202009  4
202007  202010  4
202008  202011  4
202009  202012  4
202010  202055  4
202011  202100  4
202012  202101  4

Мне нужны только следующие записи

period_start    period_end  periodelength
202000  202003  4
202004  202007  4
202008  202011  4
202012  202101  4

Как мне отфильтровать эту таблицу, чтобы получить соответствующие результаты? Кажется, это проблема островов и разрывов, но я просто не могу обернуться вокруг нее: |

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Вы, кажется, хотите:

select t.*
from (select t.*, row_number() over (order by period_start) % periodelength as seq
      from table t
     ) t
where seq = 1;
1 голос
/ 17 апреля 2020

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

DECLARE @MyTable TABLE
(
    period_start VARCHAR(6),
    period_end VARCHAR(6),
    periodlength int
)
INSERT INTO @MyTable VALUES ('202000', '202003', 4)
INSERT INTO @MyTable VALUES ('202001', '202004', 4)
INSERT INTO @MyTable VALUES ('202002', '202005', 4)
INSERT INTO @MyTable VALUES ('202003', '202006', 4)
INSERT INTO @MyTable VALUES ('202004', '202007', 4)
INSERT INTO @MyTable VALUES ('202005', '202008', 4)
INSERT INTO @MyTable VALUES ('202006', '202009', 4)
INSERT INTO @MyTable VALUES ('202007', '202010', 4)
INSERT INTO @MyTable VALUES ('202008', '202011', 4)
INSERT INTO @MyTable VALUES ('202009', '202012', 4)
INSERT INTO @MyTable VALUES ('202010', '202055', 4)
INSERT INTO @MyTable VALUES ('202011', '202100', 4)
INSERT INTO @MyTable VALUES ('202012', '202101', 4)

SELECT period_start
      ,period_end
      ,periodlength
  FROM @MyTable;

SELECT period_start
      ,period_end
      ,periodlength 
  FROM @MyTable
 WHERE CAST(period_start AS INT) % 4 = 0;

enter image description here

...