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