0

有没有办法只使用 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

4

3 回答 3

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上述表达式中的 s替换为cast(id as varchar(32)),但在 Oracle 中,您将使用cast(id as varchar2(32)).

于 2013-03-31T19:53:33.630 回答
1
SELECT CONCAT(MIN(id), '-', MAX(id)) AS id_range, value
  FROM input_table
 GROUP BY value
于 2013-03-31T19:53:24.660 回答
0

也许是这样:

SELECT MIN(ID), MAX(ID), VALUE FROM TABLE GROUP BY VALUE
于 2013-03-31T19:53:54.847 回答