能否不使用union.

qq7118622 2014-02-19 05:18:49

create table #temp(
[name] varchar(10),
[sl] int,
[rq] datetime,
[id] int IDENTITY (1, 1) NOT NULL)

insert into #temp(name,sl,rq) values('a',1,'2013-01-02')
insert into #temp(name,sl,rq) values('a',2,'2013-01-03')
insert into #temp(name,sl,rq) values('a',3,'2013-01-01')
insert into #temp(name,sl,rq) values('a',-2,'2013-01-02')
insert into #temp(name,sl,rq) values('a',-4,'2013-01-01')
insert into #temp(name,sl,rq) values('a',0,'2013-01-05')
insert into #temp(name,sl,rq) values('b',11,'2013-01-05')
insert into #temp(name,sl,rq) values('b',21,'2013-01-07')
insert into #temp(name,sl,rq) values('b',12,'2013-01-02')
insert into #temp(name,sl,rq) values('b',21,'2013-01-02')
insert into #temp(name,sl,rq) values('b',12,'2013-01-12')
insert into #temp(name,sl,rq) values('b',13,'2013-01-22')
insert into #temp(name,sl,rq) values('b',0,'2013-01-12')
insert into #temp(name,sl,rq) values('C',-10,'2013-01-05')
insert into #temp(name,sl,rq) values('C',21,'2013-01-07')
insert into #temp(name,sl,rq) values('C',12,'2013-01-02')
insert into #temp(name,sl,rq) values('C',-21,'2013-01-02')
insert into #temp(name,sl,rq) values('C',12,'2013-01-12')
insert into #temp(name,sl,rq) values('C',13,'2013-01-22')
insert into #temp(name,sl,rq) values('C',0,'2013-01-12')
--要求:
name sl rq id
a -4 2013-01-01 00:00:00.000 5
b 13 2013-01-22 00:00:00.000 12
C -21 2013-01-02 00:00:00.000 17
C 13 2013-01-22 00:00:00.000 19
/*说明:
SL为负数的:显示RQ最小的那个.
SL为正数的:显示RQ最大的那个.
我用union可以实现,想请问一下各位高手不用union如何实现?
先谢过.............
*/


...全文
216 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2014-02-19
  • 打赏
  • 举报
回复
引用 5 楼 qq7118622 的回复:
TO:roy_88 是我的要求没有写清楚,是这样的. A和C的SL都有正和负,b的SL全是正的.(不会出现同NAME的sl全是负的记录.) 要求显示: 当有正有负的时候,只显示负的RQ最小的(排除掉正的). 当全是正的时候,只显示正的RQ最大的那个.
每一个Name只显示一条数据?
select * 
from #temp as a 
where  exists(select 1 from #temp where [name]=a.[name]  having isnull(min(case when sign(sl)=-1 then [sl] end),max(case when sign([sl])!=-1 then [sl] end))=a.sl)
and not exists(select 1 from #temp where [name]=a.[name] and (sl=a.sl and rq>a.rq))

/*
name	sl	rq	id
a	-4	2013-01-01 00:00:00.000	5
b	21	2013-01-07 00:00:00.000	8
C	-21	2013-01-02 00:00:00.000	17
*/
qq7118622 2014-02-19
  • 打赏
  • 举报
回复
TO:roy_88 是我的要求没有写清楚,是这样的. A和C的SL都有正和负,b的SL全是正的.(不会出现同NAME的sl全是负的记录.) 要求显示: 当有正有负的时候,只显示负的RQ最小的(排除掉正的). 当全是正的时候,只显示正的RQ最大的那个.
LongRui888 2014-02-19
  • 打赏
  • 举报
回复
如果是2000的,那么用union还是比较方便的,如果是2005,就可以有其他的方法了。
中国风 2014-02-19
  • 打赏
  • 举报
回复
楼主贴的结果是否有误?? 以下是返回绝对值最大值的ID记录
SELECT * 
FROM #temp AS a 
WHERE NOT EXISTS(SELECT 1 FROM #temp WHERE [name]=a.[name] AND (ABS(sl)>ABS(a.sl) OR (ABS(sl)=ABS(a.sl) AND id>a.id)))
/*
name	sl	rq	id
a	-4	2013-01-01 00:00:00.000	5
b	21	2013-01-02 00:00:00.000	10
C	-21	2013-01-02 00:00:00.000	17
*/
LongRui888 2014-02-19
  • 打赏
  • 举报
回复
用union 确实比较直观,容易立即诶
發糞塗牆 2014-02-19
  • 打赏
  • 举报
回复
只有两种情况的话我觉得union挺好的

34,590

社区成员

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

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