当前位置: 首页 > 面试题库 >

Oracle-将行中的值转换为范围

锺离森
2023-03-14
问题内容

是否有任何技术可以允许这样的行设置

WITH 
base AS
(
    SELECT  1 N FROM DUAL UNION ALL
    SELECT  2 N FROM DUAL UNION ALL
    SELECT  3 N FROM DUAL UNION ALL

    SELECT  6 N FROM DUAL UNION ALL
    SELECT  7 N FROM DUAL UNION ALL

    SELECT 17 N FROM DUAL UNION ALL
    SELECT 18 N FROM DUAL UNION ALL
    SELECT 19 N FROM DUAL UNION ALL

    SELECT 21 N FROM DUAL
)
SELECT  a.N
FROM base a

产生结果

 1     3
 6     7
17    19
21    21

实际上,这是行到范围的操作。我正在Oracle Land上玩,并且希望您提出任何建议。


问题答案:

我觉得可能可以对此进行改进,但是它可以起作用:

WITH base AS  (
    SELECT  1 N FROM DUAL UNION ALL
    SELECT  2 N FROM DUAL UNION ALL
    SELECT  3 N FROM DUAL UNION ALL
    SELECT  6 N FROM DUAL UNION ALL
    SELECT  7 N FROM DUAL UNION ALL
    SELECT 17 N FROM DUAL UNION ALL
    SELECT 18 N FROM DUAL UNION ALL
    SELECT 19 N FROM DUAL UNION ALL
    SELECT 21 N FROM DUAL
)
, lagged AS
(
    SELECT n, LAG(n) OVER (ORDER BY n) lag_n FROM base
)
, groups AS
(
    SELECT n, row_number() OVER (ORDER BY n) groupnum
      FROM lagged
      WHERE lag_n IS NULL OR lag_n < n-1
)
, grouped AS
(
    SELECT n, (SELECT MAX(groupnum) FROM groups
                 WHERE groups.n <= base.n
              ) groupnum
      FROM base
)
SELECT groupnum, MIN(n), MAX(n)
  FROM grouped
  GROUP BY groupnum
  ORDER BY groupnum


 类似资料:
  • 我有一个简单的JSON对象{“a”:{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”},我想用一列“Key”将其转换成行。问题是我事先不知道钥匙的名字,或者有多少。换句话说,可能有“键4”、“键5”。也可能有“xyz1”:“xyz1”作为“a”对象中的键/值。我可以用JavaScript迭代这个JSON对象,但我这里的任务是,假设这个JSON对象作为

  • 问题内容: 我有一个查询,该查询始终返回一行且包含 许多 列。我想将其转换为2列和多行。 原始结果: 我想要的是: 这可能吗? 编辑(澄清) 我正在寻找一种自动的方法。IE浏览器,我可以传递任何只返回1行的查询结果。 问题答案: 您正在使用Oracle 11g吗?您尝试过枢轴旋转还是取消枢轴旋转? 更多信息在这里。

  • 我需要使用jolt spec在JSON中将(多个)键转换为值,将值转换为键。做这件事的正确规范应该是什么? 输入: 所需输出:

  • 问题内容: 我以前使用下面的查询将逗号分隔的字符串转换为行- 但是,现在我的分隔符是-‘〜^’ 我不能对此定界符使用相同的查询。 我预计 - 柱子 请帮忙 或如果提供的定界符为〜^,则有可能获取第n个元素 最好的祝福 问题答案: 简化此方法以拆分字符串,同时允许null: 与链接的答案一样,它会非贪婪地寻找任何字符,然后是(插入符号是转义的)或行尾的组合。该电话还采用了可选的参数指定-所以只得到了

  • 很好的一天, 我想更改一些程序代码(主要是SQL代码),因为数据库已经从DB2更改为Oracle。 这里有一个例子,我成功地改变了,但我不是真的了解它,我无法从谷歌找到它。 以下是原始SQL查询代码(使用DB2): 以下是我编辑后的SQL查询代码(成功从Oracle获取数据): 当我分析时,如果我没有将rownum更改为rownum1,我会得到错误,错误是ORA-00923:FROM关键字未在预期

  • 问题内容: 我有这种形式的查询返回值(查询返回超过50列)。 对于行值。我希望将这些详细信息转换为列并采用以下形状: 问题答案: 在纯 SQL中 ,它将需要大量编码,因为您将不得不手动放置 范围, 因为值和范围之间根本没有关系。如果存在关系,则可以使用 CASE 表达式并 动态 构建范围。 在 Oracle数据库11g第1版 及更高版本中,可以使用 UNPIVOT 上面,根据您的情况,您需要用现有