表tempid cgicode starttime endtime
1 A 2010-01-01 2010-02-01
2 A 2010-02-01 2010-03-01
3 A 2010-03-01
4 B 2010-02-01 2010-03-01
5 B 2010-03-01
6 C 2010-01-01 2010-02-01
7 C 2010-03-01
8 C 2010-04-01
9 D 2010-01-01 2010-02-01
10 D 2010-03-01
11 E 2010-02-01 2010-03-01
12 E 2010-04-01
13 E 2010-05-01想要的结果如下:
id cgicode starttime endtime 6 C 2010-01-01 2010-02-01
7 C 2010-03-01
8 C 2010-04-01
9 D 2010-01-01 2010-02-01
10 D 2010-03-01
11 E 2010-02-01 2010-03-01
12 E 2010-04-01
13 E 2010-05-01查处endtime有异常的数据,cgicode为C,是因为id为7的没有endtime,
cgicode为D是因为下一条开始日并不等于上一条的结束日
cgicode为E是因为cgicode为C和cgicode为D的总和原因,
求助各位了
1 A 2010-01-01 2010-02-01
2 A 2010-02-01 2010-03-01
3 A 2010-03-01
4 B 2010-02-01 2010-03-01
5 B 2010-03-01
6 C 2010-01-01 2010-02-01
7 C 2010-03-01
8 C 2010-04-01
9 D 2010-01-01 2010-02-01
10 D 2010-03-01
11 E 2010-02-01 2010-03-01
12 E 2010-04-01
13 E 2010-05-01想要的结果如下:
id cgicode starttime endtime 6 C 2010-01-01 2010-02-01
7 C 2010-03-01
8 C 2010-04-01
9 D 2010-01-01 2010-02-01
10 D 2010-03-01
11 E 2010-02-01 2010-03-01
12 E 2010-04-01
13 E 2010-05-01查处endtime有异常的数据,cgicode为C,是因为id为7的没有endtime,
cgicode为D是因为下一条开始日并不等于上一条的结束日
cgicode为E是因为cgicode为C和cgicode为D的总和原因,
求助各位了
解决方案 »
- plsql developer连接oracle出现ORA-12520错误
- 明天去面试oracle面向Java方向,求高手指教
- 红旗DC server5.0上安装ORACLE10G,建库时报out of memory
- 触发器如何书写,关于新增数据的导入导出?
- C语言开发oracle的一些问题
- package,java source含义
- 在Oracle网站下载的Oracle ODBC Driver 怎么使用???
- !!!有问题!ORACLE9I 一个简单表,数据量在1000万以上
- 在ORACLE中建一个A用户,怎样才可以使internal用户也不能修改A用户的密码。
- 有三张表每个表只有一个字段,我感觉这样恨不必要,请问能不能把这三个字段放到一张表里面?
- oracle游标循环问题。
- 急求数据汇总sql
2.同一个cgicode不能同时有两条endtime为null的记录
3.同一个cgicode的最后一条记录endtime必须为空
不就是select * from temp where cgicod in ('C','D','E')
SELECT cgicode FROM temp t
WHERE (t.endtime IS NULL AND EXISTS(SELECT 1 FROM temp a WHERE t.cgicode=a.cgicode AND a.id>t.id)) OR--endtime为空但不是最后一条
(t.endtime IS NOT NULL AND NOT EXISTS(SELECT 1 FROM temp b WHERE b.id>t.id)) OR--最后一条但endtime不为空
(NOT EXISTS (SELECT 1 FROM temp c WHERE c.id=t.id AND c.starttime=t.endtime) --没有后继
AND NOT EXISTS(SELECT 1 FROM temp d WHERE d.id=t.id AND t.starttime=d.endtime)--也没有前驱
AND (SELECT COUNT(*) FROM temp e WHERE t.id=e.id)<>1 )--并且不是一条记录
) ;
这样应该能满足你的要求,但是太复杂了
Select *
From t
Where Exists (Select 1 From
(Select Cgicode
From (Select Id,
Cgicode,
Starttime,
Endtime,
Lag(Endtime) Over(Partition By Cgicode Order By Starttime) l_Endtime,
Lead(Cgicode) Over(Order By Id) n_Cgicode
From t) T1
Where Starttime <> l_Endtime
Or (Endtime Is Null And Endtime = l_Endtime)
Or (Endtime Is Not Null And Cgicode <> n_Cgicode)) t2
Where t.cgicode = t2.cgicode)
凑热闹
1 A 2010-1-1 2010-2-1
2 A 2010-2-1 2010-3-1
3 A 2010-3-1
6 C 2010-1-1 2010-2-1
7 C 2010-3-1
8 C 2010-4-1
9 D 2010-1-1 2010-2-1
10 D 2010-3-1
11 E 2010-2-1 2010-3-1
12 E 2010-4-1
13 E 2010-5-1
SQL> select * from t; ID C STARTTIME ENDTIME
---------- - ---------- ----------
1 A 2010-01-01 2010-02-01
2 A 2010-02-01 2010-03-01
3 A 2010-03-01
4 B 2010-02-01 2010-03-01
5 B 2010-03-01
6 C 2010-01-01 2010-02-01
7 C 2010-03-01
8 C 2010-04-01
9 D 2010-01-01 2010-02-01
10 D 2010-03-01
11 E 2010-02-01 2010-03-01 ID C STARTTIME ENDTIME
---------- - ---------- ----------
12 E 2010-04-01
13 E 2010-05-01 已选择13行。已用时间: 00: 00: 00.01SQL> Select *
2 From t
3 Where Exists (Select 1 From
4 (Select Cgicode
5 From (Select Id,
6 Cgicode,
7 Starttime,
8 Endtime,
9 Lag(Endtime) Over(Partition By Cgicode Order By Starttime) l_Endtime,
10 Lead(Cgicode) Over(Order By Id) n_Cgicode
11 From t) T1
12 Where Starttime <> l_Endtime
13 Or (Endtime Is Null And Endtime = l_Endtime)
14 Or (Endtime Is Not Null And Cgicode <> n_Cgicode)) t2
15 Where t.cgicode = t2.cgicode); ID C STARTTIME ENDTIME
---------- - ---------- ----------
8 C 2010-04-01
7 C 2010-03-01
6 C 2010-01-01 2010-02-01
10 D 2010-03-01
9 D 2010-01-01 2010-02-01
13 E 2010-05-01
12 E 2010-04-01
11 E 2010-02-01 2010-03-01 已选择8行。已用时间: 00: 00: 00.01
不能把,我这正常啊
create table t as select * from temp;
然后再跑你的sql,出来11行,cgicode为B的以外的其他行都出来了。
我用的plsql developer
2 From t
3 Where Exists (Select 1 From
4 (Select Cgicode
5 From (Select Id,
6 Cgicode,
7 Starttime,
8 Endtime,
9 Lag(Endtime) Over(Partition By Cgicode Order By Starttime) l_Endtime,
10 Lead(Cgicode) Over(Order By Id) n_Cgicode
11 From t) T1
12 Where Starttime <> l_Endtime
13 Or (Endtime Is Null And Endtime = l_Endtime)
14 Or (Endtime Is Not Null And Cgicode <> n_Cgicode)) t2
15 Where t.cgicode = t2.cgicode);
ID CGICODE STARTTIME ENDTIME
-------------------- -------------------- -------------------- --------------------
3 A 2010-3-1
2 A 2010-2-1 2010-3-1
1 A 2010-1-1 2010-2-1
10 D 2010-3-1
9 D 2010-1-1 2010-2-1
13 E 2010-5-1
12 E 2010-4-1
11 E 2010-2-1 2010-3-1
8 C 2010-4-1
7 C 2010-3-1
6 C 2010-1-1 2010-2-1
11 rows selected
SQL> select * from t;
ID CGICODE STARTTIME ENDTIME
-------------------- -------------------- -------------------- --------------------
1 A 2010-1-1 2010-2-1
2 A 2010-2-1 2010-3-1
3 A 2010-3-1
4 B 2010-2-1 2010-3-1
5 B 2010-3-1
6 C 2010-1-1 2010-2-1
7 C 2010-3-1
8 C 2010-4-1
9 D 2010-1-1 2010-2-1
10 D 2010-3-1
11 E 2010-2-1 2010-3-1
12 E 2010-4-1
13 E 2010-5-1
13 rows selected
SQL>
3 A 2010-3-1
5 B 2010-3-1
7 C 2010-3-1
8 C 2010-4-1
10 D 2010-3-1
12 E 2010-4-1
13 E 2010-5-1
Cgicode,
Starttime,
Endtime,
Lag(Endtime) Over(Partition By Cgicode Order By Starttime) l_Endtime,
Lead(Cgicode) Over(Order By Id) n_Cgicode
From t
这个呢
1 A 2010-1-1 2010-2-1 D
10 D 2010-3-1 2010-2-1 E
11 E 2010-2-1 2010-3-1 E
12 E 2010-4-1 2010-3-1 E
13 E 2010-5-1 A
2 A 2010-2-1 2010-3-1 2010-2-1 A
3 A 2010-3-1 2010-3-1 B
4 B 2010-2-1 2010-3-1 B
5 B 2010-3-1 2010-3-1 C
6 C 2010-1-1 2010-2-1 C
7 C 2010-3-1 2010-2-1 C
8 C 2010-4-1 D
9 D 2010-1-1 2010-2-1
SQL> set timing on
SQL> set linesize 150
SQL> Select Id,
2 Cgicode,
3 Starttime,
4 Endtime,
5 Lag(Endtime) Over(Partition By Cgicode Order By Starttime) l_Endtime,
6 Lead(Cgicode) Over(Order By Id) n_Cgicode
7 From t; ID C STARTTIME ENDTIME L_ENDTIME N
---------- - -------------- -------------- -------------- -
1 A 01-1月 -10 01-2月 -10 A
2 A 01-2月 -10 01-3月 -10 01-2月 -10 A
3 A 01-3月 -10 01-3月 -10 B
4 B 01-2月 -10 01-3月 -10 B
5 B 01-3月 -10 01-3月 -10 C
6 C 01-1月 -10 01-2月 -10 C
7 C 01-3月 -10 01-2月 -10 C
8 C 01-4月 -10 D
9 D 01-1月 -10 01-2月 -10 D
10 D 01-3月 -10 01-2月 -10 E
11 E 01-2月 -10 01-3月 -10 E ID C STARTTIME ENDTIME L_ENDTIME N
---------- - -------------- -------------- -------------- -
12 E 01-4月 -10 01-3月 -10 E
13 E 01-5月 -10 已选择13行。已用时间: 00: 00: 00.00
SQL> Select *
2 From t
3 Where Exists (Select 1 From
4 (Select Cgicode
5 From (Select Id,
6 Cgicode,
7 Starttime,
8 Endtime,
9 Lag(Endtime) Over(Partition By Cgicode Order By Starttime) l_Endtime,
10 Lead(Cgicode) Over(Order By Id) n_Cgicode
11 From t) T1
12 Where Starttime <> l_Endtime
13 Or (Endtime Is Null And Endtime = l_Endtime)
14 Or (Endtime Is Not Null And Cgicode <> n_Cgicode)) t2
15 Where t.cgicode = t2.cgicode)
16 ; ID C STARTTIME ENDTIME
---------- - -------------- --------------
8 C 01-4月 -10
7 C 01-3月 -10
6 C 01-1月 -10 01-2月 -10
10 D 01-3月 -10
9 D 01-1月 -10 01-2月 -10
13 E 01-5月 -10
12 E 01-4月 -10
11 E 01-2月 -10 01-3月 -10 已选择8行。已用时间: 00: 00: 00.00
神啊,救救我吧
SQL>
SQL> Select *
2 From t
3 Where Exists (Select 1 From
4 (Select Cgicode
5 From (Select Id,
6 Cgicode,
7 Starttime,
8 Endtime,
9 Lag(Endtime) Over(Partition By Cgicode Order By Starttime) l_Endtime,
10 Lead(Cgicode) Over(Order By Id) n_Cgicode
11 From t) T1
12 Where Starttime <> l_Endtime
13 Or (Endtime Is Null And Endtime = l_Endtime)
14 Or (Endtime Is Not Null And Cgicode <> n_Cgicode)) t2
15 Where t.cgicode = t2.cgicode)
16 ;
ID CGICODE STARTTIME ENDTIME
-------------------- -------------------- -------------------- --------------------
3 A 2010-3-1
2 A 2010-2-1 2010-3-1
1 A 2010-1-1 2010-2-1
10 D 2010-3-1
9 D 2010-1-1 2010-2-1
13 E 2010-5-1
12 E 2010-4-1
11 E 2010-2-1 2010-3-1
8 C 2010-4-1
7 C 2010-3-1
6 C 2010-1-1 2010-2-1
11 rows selected
SQL>