我有一个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真的很陌生,所以不知道怎么写这个查询......
这是一个缺口和岛的问题。 你可以通过使用 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);
这是一个空隙和岛屿的问题。这是一种利用行数之间的差异来定义组的方法。
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
的数字有差距。