Как можно сравнить, если две последовательные строки произвольны на SQL сервере? - PullRequest
1 голос
/ 25 мая 2020

У меня вопрос SQL, не могу решить только с помощью SQL.

Вопрос: у меня есть таблица с 2 столбцами. Один - Question (столбец int), другой - Answer (varchar(1)):

Question  Answer
--------+---------
1       |   A
2       |   A
3       |   C
4       |   D
5       |   D
6       |   D
7       |   E
8       |   A
9       |   B
10      |   A
11      |   A
12      |   A

Результат должен выглядеть следующим образом;

Range        Answer
-----------+----------
1-2        |   A
3-3        |   C
4-6        |   D
7-7        |   E
8-8        |   A
9-9        |   B
10-12      |   A

Я только что смог это сделать,

select question, answer
from table
order by answer, question asc

Извините, я новичок в SQL, поэтому я не знаю, как писать этот запрос ..

Ответы [ 2 ]

3 голосов
/ 25 мая 2020

Это проблема промежутков и островов. Вы можете справиться с этим, используя row_number() для перечисления значений ответов. Разница между этим и вопросом постоянная - идентификация островов:

select min(question), max(question), answer
from (select t.*, row_number() over (partition by answer order by question) as seqnum
      from t
     ) t
group by (question - seqnum), answer
order by min(question);
0 голосов
/ 25 мая 2020

Это проблема промежутков и островов. Вот подход, использующий разницу между номерами строк для определения групп.

select 
    concat(min(question), '-', max(question)) range,
    answer 
from (
    select 
        t.*,
        row_number() over(order by question) rn1,
        row_number() over(partition by answer order by question) rn2
    from mytable t
) t
group by answer, rn1 - rn2
order by min(question)

Достоинством этого подхода является то, что он работает, даже если в question числах есть пробелы.

...