有没有办法只使用select语句创建一个表,该表在列中包含重复值的范围,如本例所示?
示例:
来自输入表:
id value:
1 25
2 25
3 24
4 25
5 25
6 25
7 28
8 28
9 11
应该结果:
range value
1-2 25
3-3 24
4-6 25
7-8 28
9-9 11
注意:输入表中的id值总是按顺序排列,而id排序的2个值之间的差值总是等于1
答案 0 :(得分:2)
您想要查找连续值的序列。这是一种使用窗口函数的方法:
select min(id), max(id), value
from (select id, value,
row_number() over (order by id) as rownum,
row_number() over (partition by value order by id) as seqnum
from t
) t
group by (rownum - seqnum), value;
这考虑到值可能出现在行中的不同位置。这个想法很简单。 rownum
是一个序号。 seqnum
是一个序列号,对给定值递增。对于连续的值,它们之间的差异是不变的。
让我补充一点,如果您确实希望表达式为“1-2”,我们需要更多信息。假设id是一个字符串,以下其中一个将起作用,具体取决于数据库:
select min(id)+'-'+max(id), . . .
select concat(min(id), '-', max(id)), . . .
select min(id)||'-'||max(id), . . .
如果id是一个整数(我怀疑),那么你需要用id
替换上面表达式中的cast(id as varchar(32))
,除了在Oracle中你要使用{{1} }。
答案 1 :(得分:1)
SELECT CONCAT(MIN(id), '-', MAX(id)) AS id_range, value
FROM input_table
GROUP BY value
答案 2 :(得分:0)
也许这个:
SELECT MIN(ID), MAX(ID), VALUE FROM TABLE GROUP BY VALUE