首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL中基于序列对值进行分组

在SQL中基于序列对值进行分组
EN

Stack Overflow用户
提问于 2013-04-01 03:51:19
回答 3查看 182关注 0票数 0

有没有一种方法可以只使用SELECT语句创建一个表,该表在一列中包含重复值的范围,如本例所示?

示例:

在输入表中:

代码语言:javascript
运行
复制
id value:
1 25
2 25
3 24
4 25
5 25
6 25
7 28
8 28
9 11

结果应该是:

代码语言:javascript
运行
复制
range value
1-2 25
3-3 24
4-6 25
7-8 28
9-9 11

注意:输入表中的id值始终是有序的,并且按id排序的两个值之间的差值始终等于1

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-01 03:53:34

您想要查找连续值的序列。以下是一种使用窗口函数的方法:

代码语言:javascript
运行
复制
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是一个字符串,根据数据库的不同,可以使用以下方法之一:

代码语言:javascript
运行
复制
select min(id)+'-'+max(id), . . .
select concat(min(id), '-', max(id)), . . .
select min(id)||'-'||max(id), . . .

如果id是一个整数(正如我怀疑的那样),那么您需要将上面表达式中的ids替换为cast(id as varchar(32)),但在Oracle中除外,因为您将使用cast(id as varchar2(32))

票数 2
EN

Stack Overflow用户

发布于 2013-04-01 03:53:25

代码语言:javascript
运行
复制
SELECT CONCAT(MIN(id), '-', MAX(id)) AS id_range, value
  FROM input_table
 GROUP BY value
票数 1
EN

Stack Overflow用户

发布于 2013-04-01 03:53:55

也许是这样的:

代码语言:javascript
运行
复制
SELECT MIN(ID), MAX(ID), VALUE FROM TABLE GROUP BY VALUE
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15733796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档