Установка счетчика соответствующим образом в последовательных строках в T-SQL - PullRequest
0 голосов
/ 10 октября 2019

У меня две проблемы.

Задача 1:

У меня есть таблица значений со схемой:

CREATE TABLE Numbers (Id int, Column1 int);

Давайте предположим, чтоследующие данные:

INSERT INTO Numbers (Id int, Column1)
VALUES
 (1, 1),
 (2, 0),
 (3, 0),
 (4, 0),
 (5, 1),
 (6, 1),
 (7, 1),
 (8, 0),
 (9, 1),
 (10, 1),
 (11, 0),
 (12, 1);

Мне нужен запрос T-SQL для генерации следующих данных в качестве желаемого результата:

 Id, Column1, GroupID
 (1, 1, 1)
 (2, 0, 2)
 (3, 0, 3)
 (4, 0, 4)
 (5, 1, 5)
 (6, 1, 5)
 (7, 1, 5)
 (8, 0, 6)
 (9, 1, 7)
 (10, 1, 7)
 (11, 0, 8)
 (12, 1, 9)

Когда существует последовательная единица, счетчик повторяется / копируется.

Задача 2:

У меня есть таблица значений со схемой:

CREATE TABLE Numbers (Id int, Column1 int, Column2 int);

Допустим, следующие данные:

INSERT INTO Numbers (Column1, Column2)
VALUES
 (1, 1, 1),
 (2, 1, 0),
 (3, 1, 0),
 (4, 1, 0),
 (5, 1, 1),
 (6, 1, 1),
 (7, 1, 1),
 (8, 1, 0),
 (9, 1, 1),
 (10, 1, 1),
 (11, 1, 0),
 (12, 1, 1),

 (13, 1),
 (14, 0),
 (15, 0),
 (16, 0),
 (17, 1),
 (18, 1),
 (19, 1),
 (20, 0),
 (21, 1),
 (22, 1),
 (23, 0),
 (24, 1);

Мне нужен запрос T-SQL для генерации следующих данных в качестве желаемого результата:

 Id, Column1, Column2, GroupID
 (1, 1, 1, 1)
 (2, 1, 0, 2)
 (3, 1, 0, 3)
 (4, 1, 0, 4)
 (5, 1, 1, 5)
 (6, 1, 1, 5)
 (7, 1, 1, 5)
 (8, 1, 0, 6)
 (9, 1, 1, 7)
 (10, 1, 1, 7)
 (11, 1, 0, 8)
 (12, 1, 1, 9)

 (13, 2, 1, 1)
 (14, 2, 0, 2)
 (15, 2, 0, 3)
 (16, 2, 0, 4)
 (17, 2, 1, 5)
 (18, 2, 1, 5)
 (19, 2, 1, 5)
 (20, 2, 0, 6)
 (21, 2, 1, 7)
 (22, 2, 1, 7)
 (23, 2, 0, 8)
 (24, 2, 1, 9)

Когда существует последовательная единица, счетчик повторяется / копируется. Однако при поступлении нового значения для столбца 1. счетчик сбрасывается.

-

Запросы T-SQL должны выполняться в MS SQL Server в хранилище данных Microsoft Azure SQL.

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Если у вас есть столбец, в котором указан порядок. Каждый использует lag() и совокупная сумма:

select t.*,
       sum(case when prev_column is null or prev_column <> column
                then 1 else 0
           end) over (order by ?)
from (select t.*, lag(column) over (order by ?) as prev_column
      from t
     ) t;

? для столбца заказа.

1 голос
/ 10 октября 2019

Запрос Гордона работает, если условие изменяется на or not (column1=1 and prev_column=1), что эквивалентно or column1!=1 or prev_column!=1. Этот запрос:

select Id,Column1,
       sum(case when prev_column is null or column1!=1 or prev_column!=1
                then 1 else 0
           end) over (order by id) as GroupID
from (select t.*, lag(column1) over (order by id) as prev_column
      from @numbers t
     ) t;

Возвращает

Id  Column1 GroupID
1   1   1
2   0   2
3   0   3
4   0   4
5   1   5
6   1   5
7   1   5
8   0   6
9   1   7
10  1   7
11  0   8
12  1   9

Вторая проблема работает одинаково для каждого отдельного значения Column2. Это требует PARTITION BY column2:

 select Id,Column1,Column2,
       sum(case when prev_column is null or column2!=1 or prev_column!=1
                then 1 else 0
           end) over (partition by column1 order by id) as GroupID
from (select t.*, lag(column2) over (partition by column1 order by id) as prev_column
      from @numbers t
     ) t;

Это производит:

Id  Column1 Column2 GroupID
1   1   1   1
2   1   0   2
3   1   0   3
4   1   0   4
5   1   1   5
6   1   1   5
7   1   1   5
8   1   0   6
9   1   1   7
10  1   1   7
11  1   0   8
12  1   1   9
13  2   1   1
14  2   0   2
15  2   0   3
16  2   0   4
17  2   1   5
18  2   1   5
19  2   1   5
20  2   0   6
21  2   1   7
22  2   1   7
23  2   0   8
24  2   1   9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...