在SQL Server中如何比较两个连续行是否是任意行?

问题描述 投票:1回答:2

我有一个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真的很陌生,所以不知道怎么写这个查询......

sql sql-server tsql gaps-and-islands
2个回答
3
投票

这是一个缺口和岛的问题。 你可以通过使用 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
投票

这是一个空隙和岛屿的问题。这是一种利用行数之间的差异来定义组的方法。

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的数字有差距。

© www.soinside.com 2019 - 2024. All rights reserved.