SQL优化

Jephen 2009-11-26 11:41:13
ID DATE CODE TIME
=============================
A 1123 9 0015
A 1123 0 1535
A 1123 9 1620

A 1124 0 2330
A 1124 9 0010

针对以上数据请教一个SQL,查询出满足以下条件的数据集:

11月23日当天所有CODE=0和9的记录,并且CODE=9的TIME必须大于CODE=0中最小TIME

能否用最优化的办法查询,因为数据表很大;
...全文
167 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jephen 2009-11-26
  • 打赏
  • 举报
回复
更正一下:CODE=0的最小值和CODE=9并TIMED大于CODE=0中最小TIME记录分组:
Jephen 2009-11-26
  • 打赏
  • 举报
回复
ID DATE CODE TIME
=============================
A 1123 9 0015
A 1123 0 1535
A 1123 9 1620

A 1124 0 2330
A 1124 9 2340
A 1124 0 2356
A 1124 9 2358

B 1123 0 0705
B 1123 9 1706

B 1124 0 0710
B 1124 9 0806
B 1124 0 1659
B 1124 9 1706

针对以上数据请教一个SQL,查询出满足以下条件的数据集:

ID列中所有人

CODE=0的最小值和CODE=9并TIME小于CODE=0中最小TIME记录分组:

样式如下:

ID DATE MIN_TIME_0 MIN_TIME_9
==============================================
A 1123 1525 1620
A 1124 2330 2358
B 1123 0705 1706
B 1124 0710 0806
--小F-- 2009-11-26
  • 打赏
  • 举报
回复
select 
*
from
tb a
where
not exists (select 1 from (select time=min(time) from tb where code=0 ) t where t.time>a.time)
and
code in ('0','9')
ChinaJiaBing 2009-11-26
  • 打赏
  • 举报
回复


declare @tb table (id nvarchar(10),date int,code int,time int)
insert into @tb select 'A',1123,9,15
union all select 'A',1123,0,1535
union all select 'A',1123,9,1620
union all select 'A',1124,0,2330
union all select 'A',1124,9,0010
select * from @tb a where not exists
(select 1 from (select time=min(time) from @tb where code=0 ) t where t.time>a.time)


/*


(5 行受影响)
id date code time
---------- ----------- ----------- -----------
A 1123 0 1535
A 1123 9 1620
A 1124 0 2330

(3 行受影响)


*/

icelovey 2009-11-26
  • 打赏
  • 举报
回复

最优的等楼下

-- =============================================
-- Author: T.O.P
-- Create date: 2009/11/26
-- Version: SQL SERVER 2005
-- =============================================
declare @TB table([ID] varchar(1),[DATE] int,[CODE] int,[TIME] varchar(4))
insert @TB
select 'A',1123,9,'0015' union all
select 'A',1123,0,'1535' union all
select 'A',1123,9,'1620' union all
select 'A',1124,0,'2330' union all
select 'A',1124,9,'0010'

select *
from @TB a
where (code=0)
or (code=9 and [TIME]>(select min(time) from @tb where code=0))


--测试结果:
/*
ID DATE CODE TIME
---- ----------- ----------- ----
A 1123 0 1535
A 1123 9 1620
A 1124 0 2330

(3 row(s) affected)

*/
Q315054403 2009-11-26
  • 打赏
  • 举报
回复
有偿支持
Jephen 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liangck 的回复:]
SQL code--> 生成测试数据: @tbDECLARE@tbTABLE (IDvarchar(1),DATEint,CODEint,TIMEvarchar(4))INSERTINTO@tbSELECT'A',1123,9,'0015'UNIONALLSELECT'A',1123,0,'1535'UNIONALLSELECT'A',1123,9,'1620'UNIONALLSELECT'A',?-
[/Quote]

但是执行还是有问题。。。。。。
liangCK 2009-11-26
  • 打赏
  • 举报
回复
--> 生成测试数据: @tb
DECLARE @tb TABLE (ID varchar(1),DATE int,CODE int,TIME varchar(4))
INSERT INTO @tb
SELECT 'A',1123,9,'0015' UNION ALL
SELECT 'A',1123,0,'1535' UNION ALL
SELECT 'A',1123,9,'1620' UNION ALL
SELECT 'A',1124,0,'2330' UNION ALL
SELECT 'A',1124,9,'2340' UNION ALL
SELECT 'A',1124,0,'2356' UNION ALL
SELECT 'A',1124,9,'2358' UNION ALL
SELECT 'B',1123,0,'0705' UNION ALL
SELECT 'B',1123,9,'1706' UNION ALL
SELECT 'B',1124,0,'0710' UNION ALL
SELECT 'B',1124,9,'0806' UNION ALL
SELECT 'B',1124,0,'1659' UNION ALL
SELECT 'B',1124,9,'1706'

--SQL查询如下:

SELECT A.ID,A.DATE,A.MIN_TIME_0,B.TIME AS MIN_TIME_9
FROM (SELECT ID,DATE,MIN(TIME) AS MIN_TIME_0
FROM @tb WHERE CODE = 0 GROUP BY ID,DATE) AS A
JOIN @tb AS B
ON A.ID=B.ID AND A.DATE =B.DATE
AND B.CODE = 9 AND B.TIME > A.MIN_TIME_0
WHERE NOT EXISTS(
SELECT * FROM @tb
WHERE ID = B.ID AND DATE = B.DATE
AND CODE = 9 AND TIME < B.TIME
AND TIME > A.MIN_TIME_0
)
ORDER BY 1,2;

/*
ID DATE MIN_TIME_0 MIN_TIME_9
---- ----------- ---------- ----------
A 1123 1535 1620
A 1124 2330 2340
B 1123 0705 1706
B 1124 0710 0806

(4 行受影响)


*/
Jephen 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liangck 的回复:]
SQL code--> 生成测试数据: @tbDECLARE@tbTABLE (IDvarchar(1),DATEint,CODEint,TIMEvarchar(4))INSERTINTO@tbSELECT'A',1123,9,'0015'UNIONALLSELECT'A',1123,0,'1535'UNIONALLSELECT'A',1123,9,'1620'UNIONALLSELECT'A',?-
[/Quote]

#7楼的弟兄,我的是SQL 2000,用不起来
sytdeedee 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icelovey 的回复:]
SQL code
最优的等楼下-- =============================================
-- Author: T.O.P
-- Create date: 2009/11/26
-- Version: SQL SERVER 2005
-- =============================================declare?-
[/Quote]

你贴的代码是用什么工具生成的,注释,结果集是自己写的还是自动生成的
liangCK 2009-11-26
  • 打赏
  • 举报
回复


--> 生成测试数据: @tb
DECLARE @tb TABLE (ID varchar(1),DATE int,CODE int,TIME varchar(4))
INSERT INTO @tb
SELECT 'A',1123,9,'0015' UNION ALL
SELECT 'A',1123,0,'1535' UNION ALL
SELECT 'A',1123,9,'1620' UNION ALL
SELECT 'A',1124,0,'2330' UNION ALL
SELECT 'A',1124,9,'2340' UNION ALL
SELECT 'A',1124,0,'2356' UNION ALL
SELECT 'A',1124,9,'2358' UNION ALL
SELECT 'B',1123,0,'0705' UNION ALL
SELECT 'B',1123,9,'1706' UNION ALL
SELECT 'B',1124,0,'0710' UNION ALL
SELECT 'B',1124,9,'0806' UNION ALL
SELECT 'B',1124,0,'1659' UNION ALL
SELECT 'B',1124,9,'1706'

--SQL查询如下:

SELECT *
FROM (SELECT ID,DATE,MIN(TIME) AS MIN_TIME_0
FROM @tb WHERE CODE= 0 GROUP BY ID,DATE) AS T
OUTER APPLY (SELECT MIN(TIME) AS MIN_TIME_9 FROM @tb
WHERE ID = T.ID AND DATE = T.DATE
AND CODE = 9 AND TIME > T.MIN_TIME_0) AS B
ORDER BY 1,2

/*
ID DATE MIN_TIME_0 MIN_TIME_9
---- ----------- ---------- ----------
A 1123 1535 1620
A 1124 2330 2340
B 1123 0705 1706
B 1124 0710 0806

(4 行受影响)

*/
liangCK 2009-11-26
  • 打赏
  • 举报
回复
A 1124 0 2330
A 1124 9 2340
A 1124 0 2356
A 1124 9 2358

--
为0的TIME最小是2330..大于它的为9的最小记录是2340

样式如下:

ID DATE MIN_TIME_0 MIN_TIME_9
==============================================
A 1123 1525 1620
A 1124 2330 2358
B 1123 0705 1706
B 1124 0710 0806

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧