早教吧 育儿知识 作业答案 考试题库 百科 知识分享

如果在一个循环中对比两条记录?createtableBBUSERINFOT(USERIDNUMBER(10)NOTNULL,PRODUCTIDVARCHAR2(8)NOTNULL,BEGINDATEDATENOTNULL,ENDDATEDATENOTNULL);表结构如上,一个userid对应有多个productid现在要做同

题目详情
如果在一个循环中对比两条记录?
create table BB_USER_INFO_T
(
USER_ID NUMBER(10) NOT NULL,
PRODUCT_ID VARCHAR2(8) NOT NULL,
BEGIN_DATE DATE NOT NULL,
END_DATE DATE NOT NULL);
表结构如上,
一个user_id 对应有多个product_id
现在要做同一个user_id的前一个product_id的end_date和后一个product_id的begin_date做比较,如果相等就是正确,不等,就把这个product_id给变量?
怎么实现啊?
补充数据:
user_id product_id begin_date end_date
000001 1232131 2010-01-01 2010-02-01
000001 1232332 2010-02-01 2011-01-01
000001 1233434 2010-03-01 2011-01-01
00002------------------------------------------
如上:user_id=000001 的数据,正常情况下第二条product_id=1232332的end_date应该是第三条product_id=1233434的begin_date
我现在需要通过循环,找出像第二条这样错误的数据.如果找出.将第二条的product_id给变量,外层的要使用.并,将第三条的begin_date也给出.外层用于update第二条的end_date;
再次补充,是oracle环境,3楼的大哥,你那个方法我在oracle执行不下去哇?是否可以补充一下?
▼优质解答
答案和解析
--> 测试数据:#A
if object_id('tempdb.dbo.#A') is not null drop table #A
create table #A ([user_id] varchar(6),product_id int,begin_date datetime,end_date datetime)
insert into #A
select '000001',1232131,'2010-01-01','2010-02-01' union all
select '000001',1232332,'2010-02-01','2011-01-01' union all
select '000001',1233434,'2010-03-01','2011-01-01'
select
*,
(SELECT TOP 1 begin_date from #A WHERE [user_id]=A.[user_id] AND product_id>A.product_id ORDER BY product_id) AS NEXTDATE
FROM
#A A
WHERE ISNULL((SELECT TOP 1 begin_date from #A WHERE [user_id]=A.[user_id] AND product_id>A.product_id ORDER BY product_id),end_date)end_date
/*
(所影响的行数为 3 行)
user_id product_id begin_date end_date NEXTDATE
------- ----------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------
000001 1232332 2010-02-01 00:00:00.000 2011-01-01 00:00:00.000 2010-03-01 00:00:00.000
(所影响的行数为 1 行)