首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用oracle 11g中的sql查询实现以下输出。

如何使用oracle 11g中的sql查询实现以下输出。
EN

Stack Overflow用户
提问于 2013-02-27 10:24:05
回答 3查看 96关注 0票数 0

我的桌子上有以下数据:

Block_id值

代码语言:javascript
运行
复制
1             5
2             5
3             5
4             0
5             0
6             4
7             4

我还必须编写给我以下输出的查询:

Block_id

代码语言:javascript
运行
复制
   1-3
   6-7

如何在Oracle 11g中使用pl/sql来实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-27 11:22:11

你可以这样做:

代码语言:javascript
运行
复制
SQL> select * from data order by block_id;

  BLOCK_ID      VALUE
---------- ----------
         1          5
         2          5
         3          5
         4          0
         5          0
         6          4
         7          4
         9          5
        10          5
        12          2

SQL> select min(block_id) || '-' || max(block_id) block_range, value
  2    from (select block_id, value, max(grp) over (partition by value order by block_id) grp
  3            from (select block_id, value,
  4                         case
  5                           when lag(block_id) over (partition by value order by block_id) < block_id - 1
  6                           then
  7                             row_number() over (partition by value order by block_id)
  8                           when row_number() over (partition by value order by block_id) = 1 then 1
  9                           else null
 10                         end grp
 11                    from data
 12                   where value != 0))
 13   group by value, grp
 14   order by min(block_id);

BLOCK_RANG      VALUE
---------- ----------
1-3                 5
6-7                 4
9-10                5
12-12               2
票数 1
EN

Stack Overflow用户

发布于 2013-02-27 10:32:12

您不需要PL/SQL来完成这个任务,一个简单的查询就可以做到:

代码语言:javascript
运行
复制
CREATE TABLE test(
    a   INTEGER,
    b   INTEGER
);

INSERT INTO test VALUES (1, 5);
INSERT INTO test VALUES (2, 5);
INSERT INTO test VALUES (3, 5);
INSERT INTO test VALUES (4, 0);
INSERT INTO test VALUES (5, 0);
INSERT INTO test VALUES (6, 4);
INSERT INTO test VALUES (7, 4);

select min(a) || '-' || max(a) from test group by b order by 1;
票数 0
EN

Stack Overflow用户

发布于 2013-02-27 10:33:08

另一种方法是使用聚合函数:

代码语言:javascript
运行
复制
select distinct
        min(block_id) over (partition by value) || '-' ||
        max(block_id) over (partition by value)
   from whatever_your_table_is_called
   where value > 0;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15109646

复制
相关文章

相似问题

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