我有一张看起来像这样的表,
Date Value
01/01/2010 03:59:00 324.44
01/02/2010 09:31:00 NULL
01/02/2010 09:32:00 NULL
.
.
.
01/02/2010 11:42:00 NULL
我希望第一个有效值出现在以下所有行中。这就是我做的,
select date,
nvl(value, LAST_VALUE(value IGNORE NULLS) over (order by value RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)) value
from
table
这显示没有任何区别,但如果我说RANGE BETWEEN 3 PRECEDING AND CURRENT ROW
,它会将数据复制到所有行。我不清楚为什么会这样。任何人都可以解释我是否误解了如何使用前面的?
答案 0 :(得分:2)
分析函数仍然适用于数据集。它们不会一次处理一行,您需要PL / SQL或MODEL来执行此操作。 PRECEDING
指的是最后的X行,但是在应用分析函数之前。
这些问题在SQL中可能会引起混淆,因为您必须构建逻辑来定义集合,而不是尝试将数据从一行传递到另一行。这就是我在previous answer中使用CASE
和LAST_VALUE
的原因。
修改强>
我添加了一个简单的数据集,因此我们都可以运行完全相同的查询。 VALUE1
似乎对我有用,我错过了什么吗? VALUE2
的部分问题是分析ORDER BY使用VALUE而不是日期。
select id, the_date, value
,last_value(value ignore nulls) over
(partition by id order by the_date) value1
,nvl(value, LAST_VALUE(value IGNORE NULLS) over
(order by value RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)) value2
from
(
select 1 id, date '2011-01-01' the_date, 100 value from dual union all
select 1 id, date '2011-01-02' the_date, null value from dual union all
select 1 id, date '2011-01-03' the_date, null value from dual union all
select 1 id, date '2011-01-04' the_date, null value from dual union all
select 1 id, date '2011-01-05' the_date, 200 value from dual
)
order by the_date;
结果:
ID THE_DATE VALUE VALUE1 VALUE2
1 1/1/2011 100 100 100
1 1/2/2011 100
1 1/3/2011 100
1 1/4/2011 100
1 1/5/2011 200 200 200
答案 1 :(得分:0)
可以复制一行,因为我已经使用java Logic和Sql查询
完成了这一行 Statement sta;
ResultSet rs,rslast;
try{
//连接创建代码和“con”是Connection Class的对象,所以不要混淆。
sta = con.createStatement();
rs=sta.executeQuery("SELECT * FROM TABLE NAME");
rslast=sta.executeQuery("SELECT * FROM TABLENAME WHERE ID = (SELECT MAX(ID) FROM TABLENAME)");
rslast.next();
String digit =rslast.getString("ID");
System.out.print("ID"+rslast.getString("ID")); // it gives ID of the Last Record.
使用此方法,您也可以按降序使用ORDER by Date。
现在我希望你制作只插入最后记录的逻辑。