有没有一种方法可以只使用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排序的两个值之间的差值始终等于1
发布于 2013-04-01 03:53:34
您想要查找连续值的序列。以下是一种使用窗口函数的方法:
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
s替换为cast(id as varchar(32))
,但在Oracle中除外,因为您将使用cast(id as varchar2(32))
。
发布于 2013-04-01 03:53:25
SELECT CONCAT(MIN(id), '-', MAX(id)) AS id_range, value
FROM input_table
GROUP BY value
发布于 2013-04-01 03:53:55
也许是这样的:
SELECT MIN(ID), MAX(ID), VALUE FROM TABLE GROUP BY VALUE
https://stackoverflow.com/questions/15733796
复制相似问题