Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在oracle中查询特定格式的所需数据_Sql_Oracle_Gaps And Islands - Fatal编程技术网

Sql 在oracle中查询特定格式的所需数据

Sql 在oracle中查询特定格式的所需数据,sql,oracle,gaps-and-islands,Sql,Oracle,Gaps And Islands,我的数据如下表所示: 三列 date1 fromdate value --------------------- 14 0 150 14 2 150 14 3 150 14 4 120 14 5 120 14 6 150 14 7 150 我需要编写sql查询以获取以下格式的数据: Date1 fromdate todate valu

我的数据如下表所示:

三列

 date1 fromdate value
 ---------------------
 14     0       150
 14     2       150
 14     3       150
 14     4       120
 14     5       120
 14     6       150
 14     7       150 
我需要编写sql查询以获取以下格式的数据:

 Date1 fromdate todate value
 ----------------------------
 14     0       3      150
 14     4       5      120
 14     6       7      150
oracle中的SQL查询可以这样做吗?

请尝试:

SELECT
  Date1, 
  MIN(fromdate) FromDate, 
  MAX(fromdate) ToDate, 
  "Value"
FROM
  "YourTable" 
GROUP BY Date1, "Value";

您需要将值为150的行拆分为两个单独的部分。您可以通过使用分析函数来实现这一点。
lead
功能允许您按一定顺序查看下一行的值。在这种情况下,您希望在fromdate之前找到不同的值顺序:

select lead(value) over (order by fromdate) from tab;
然后,您可以将其与当前值进行比较,以查看它们何时更改,并在更改时输出一个鉴别器:

select value, case when ld <> value or ld is null then rownum end c from (
  select value, lead(value) over (order by fromdate) ld from tab
)

VALUE, C
-----------
150    null
150    null
150    3
120    null
120    5
150    null
150    7

哪个数据库?SQL server、Oracle、My SQL?正如标题中提到的。。。它的预言你需要解释你是如何得到输出的。。。让我们更容易地帮助您……标签中应包含“环境”(您使用的产品等)——这是人们寻找它的地方(而不是标题);为YouTunks techdo添加了
Oracle
标签。。。。非常感谢你宝贵的回答,但我希望得到我提到的准确输出。通过你的查询,它只返回两行不正确的内容。根据你的查询,它给出两行内容:第一行是0-7,另一行是4-5。我不想这样。@user2035000它返回的正是他的查询所要求的;然而,鉴于数据集,他的查询在您的情况下无法工作。此外,我看不到任何SQL方法可以做到这一点。@AlbertoPonte-不要这么快就放弃SQL;这完全有可能。哇。。。。。。。。。太棒了谢谢非常感谢。。这正是我想要的。。
select date1, value, d, min(fromdate), max(fromdate)
from (
  select date1, fromdate, value,
         --"fill down" the discriminator, so you can group by it at the next level 
         min(c) over (order by fromdate desc) d 
  from (
    select date1, fromdate, value, ld, 
           --compare the next value with the current, if they're different
           --show an indicator
           case when value <> ld or ld is null then rownum else null end c
    from (
      select date1, fromdate, value,lead(value) over (order by fromdate) ld
      from tab
    )
  )
)
group by date1, value, d