求一sql的写法

qinzhuhua 2010-10-29 11:40:09
现有如下数据:
主叫号码 被叫号码 类型 手机识别码 日期
13755190211 13755190212 MOC 111 2010-3-1
13755190211 13755190212 MTC 111 2010-3-4
13755190211 13755190212 MOC 222 2010-3-3
13755190212 13755190211 MTC 121 2010-3-1
13755190212 13755190211 MOC 122 2010-3-3
13755190212 13755190211 MTCSMS 2010-3-3

主叫号码跟被叫号码都是手机号码,每一个手机号码都会有一个识别码,由于存在历史数据的原因,
所以数据会有重复,且不同日期,手机识别码会出现不同的情况。
如果是MOC类型,则相应的手机识别码指的是主叫号码的识别码。
如果是MTC类型,则相应的手机识别码指的是被叫号码的识别码。

要求:取出所有手机号码最新的识别码(不出现重复的手机号码),只考虑MOC、MTC类型数据,不考虑MTCSMS数据。
如上数据,得出的结果为:
手机号码 手机识别码
13755190211 222
13755190212 111
我用的是Sql2005,这个语句怎么写?
(如果不能一次用SQL写出来,用SQL达到大部分要求,然后在程序中写个简单判断达到目的也行,因为我要把这些查询出的数据放入HashTable中,然后跟别一张表进行比较的)
...全文
143 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinzhuhua 2010-11-02
  • 打赏
  • 举报
回复
谢谢各位的回答,结帐给分咯!
abuying 2010-10-30
  • 打赏
  • 举报
回复
1#,2#的测试有问题!第二行手机识别码及日期数据错了

create table #(主叫号码 bigint, 被叫号码 bigint, 类型 varchar(8), 手机识别码 varchar(8), 日期 datetime)
truncate table #
insert into #
select 13755190211, 13755190212, 'MOC', '111', '2010-3-1' union all
select 13755190211, 13755190212, 'MTC', '111', '2010-3-4' union all
select 13755190211, 13755190212, 'MOC', '222', '2010-3-3' union all
select 13755190212, 13755190211, 'MTC', '121', '2010-3-1' union all
select 13755190212, 13755190211, 'MOC', '122', '2010-3-3' union all
select 13755190212, 13755190211, 'MTCSMS', '', '2010-3-3'
GO
select 主叫号码,手机识别码,日期 from (
select *,id=ROW_NUMBER()over(partition by 主叫号码 order by 日期 desc)
from
(select 主叫号码=case when 类型='MOC' then 主叫号码 when 类型='MTC' then 被叫号码 end,
手机识别码,
日期
from # where 类型 in('MOC','MTC')
) t
) m where m.id=1

主叫号码 手机识别码    日期
------------   --------   -----------------------
13755190211 222 2010-03-03 00:00:00.000
13755190212 111 2010-03-04 00:00:00.000

(2 行受影响)
qinzhuhua 2010-10-29
  • 打赏
  • 举报
回复
为了体现:
如果是MOC类型,则相应的手机识别码指的是主叫号码的识别码。
如果是MTC类型,则相应的手机识别码指的是被叫号码的识别码。

我把数据改了一下,你开始回答时,是我写的第一次的数据,后面改了
用我写的例子要出现我后面写的结果才是对的
dawugui 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qinzhuhua 的回复:]
因为用户可能会换手机啊,换了手机的话,识别码就变了,所以同一号码有可能不用的日期识别码不同[/Quote]六楼两种情况都给你了,看你怎么用了?
qinzhuhua 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dawugui 的回复:]
楼主的数据貌似出现了歧义。


SQL code
create table tb(主叫号码 varchar(20),被叫号码 varchar(20),类型 varchar(20),手机识别码 varchar(10),日期 datetime)
insert into tb values('13755190211', '13755190212', 'MOC', '111', '2010-3-……
[/Quote]

因为用户可能会换手机啊,换了手机的话,识别码就变了,所以同一号码有可能不用的日期识别码不同
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qinzhuhua 的回复:]

我写的数据只是举个例子,表中实际上有几百万的数据
查询的结果还需要更新另一张手机资料表
所以还需考虑实际应用中的速度
[/Quote]

现在谈效率太迟了,应该在设计的时候谈,为什么会产生不同的识别码。
dawugui 2010-10-29
  • 打赏
  • 举报
回复
楼主的数据貌似出现了歧义。

create table tb(主叫号码 varchar(20),被叫号码 varchar(20),类型 varchar(20),手机识别码 varchar(10),日期 datetime)
insert into tb values('13755190211', '13755190212', 'MOC', '111', '2010-3-1')
insert into tb values('13755190211', '13755190212', 'MTC', '111', '2010-3-4')
insert into tb values('13755190211', '13755190212', 'MOC', '222', '2010-3-3')
insert into tb values('13755190212', '13755190211', 'MTC', '121', '2010-3-1')
insert into tb values('13755190212', '13755190211', 'MOC', '122', '2010-3-3')
insert into tb values('13755190212', '13755190211', 'MTCSMS','' ,'2010-3-3')
go

select t.* from tb t where 类型 in ('MOC','MTC') and 日期 = (select max(日期) from tb where 类型 in ('MOC','MTC') and (主叫号码 = t.主叫号码 or 主叫号码 = t.被叫号码))
/*
主叫号码 被叫号码 类型 手机识别码 日期
-------------------- -------------------- -------------------- ---------- ------------------------------------------------------
13755190211 13755190212 MTC 111 2010-03-04 00:00:00.000

(所影响的行数为 1 行)
*/

select t.* from tb t where 类型 in ('MOC','MTC') and 日期 = (select max(日期) from tb where 类型 in ('MOC','MTC') and (主叫号码 = t.主叫号码 or 被叫号码 = t.被叫号码))
/*
主叫号码 被叫号码 类型 手机识别码 日期
-------------------- -------------------- -------------------- ---------- ------------------------------------------------------
13755190211 13755190212 MTC 111 2010-03-04 00:00:00.000
13755190212 13755190211 MOC 122 2010-03-03 00:00:00.000

(所影响的行数为 2 行)
*/

drop table tb

qinzhuhua 2010-10-29
  • 打赏
  • 举报
回复
我写的数据只是举个例子,表中实际上有几百万的数据
查询的结果还需要更新另一张手机资料表
所以还需考虑实际应用中的速度
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
cte2 as
(
select row=row_number()over(partition by phone order by date desc), * from cte
)
dawugui 2010-10-29
  • 打赏
  • 举报
回复
select t.* from tb t where 类型 in ('MOC','MTC') and 日期 = (select max(日期) from tb where 类型 in ('MOC','MTC') and (主叫号码 = t.主叫号码 or 主叫号码 = t.被叫号码))
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
--> 测试数据:#
if object_id('tempdb.dbo.#') is not null drop table #
create table #(主叫号码 bigint, 被叫号码 bigint, 类型 varchar(8), 手机识别码 varchar(8), 日期 datetime)
insert into #
select 13755190211, 13755190212, 'MOC', '111', '2010-3-1' union all
select 13755190211, 13755190212, 'MOC', '111', '2010-3-2' union all
select 13755190211, 13755190212, 'MOC', '222', '2010-3-3' union all
select 13755190212, 13755190211, 'MTC', '121', '2010-3-1' union all
select 13755190212, 13755190211, 'MTC', '122', '2010-3-3' union all
select 13755190212, 13755190211, 'MTCSMS', '', '2010-3-3'

;with cte as
(
select 主叫号码 phone, 日期 date, 手机识别码 mark from # where 类型='MOC'
union all
select 被叫号码 phone, 日期 date, 手机识别码 mark from # where 类型='MTC'
),
cte2 as
(
select row=row_number()over(partition by phone order by date), * from cte
)
select * from cte2 t where not exists (select 1 from cte2 where phone=t.phone and row>t.row)

/*
row phone date mark
-------------------- -------------------- ----------------------- --------
5 13755190211 2010-03-03 00:00:00.000 122
*/
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
--> 测试数据:#
if object_id('tempdb.dbo.#') is not null drop table #
create table #(主叫号码 bigint, 被叫号码 bigint, 类型 varchar(8), 手机识别码 varchar(8), 日期 datetime)
insert into #
select 13755190211, 13755190212, 'MOC', '111', '2010-3-1' union all
select 13755190211, 13755190212, 'MOC', '111', '2010-3-2' union all
select 13755190211, 13755190212, 'MOC', '222', '2010-3-3' union all
select 13755190212, 13755190211, 'MTC', '121', '2010-3-1' union all
select 13755190212, 13755190211, 'MTC', '122', '2010-3-3' union all
select 13755190212, 13755190211, 'MTCSMS', '', '2010-3-3'

;with cte as
(
select 主叫号码 phone, 日期 date, 手机识别码 mark from # where 类型='MOC'
union all
select 被叫号码 phone, 日期 date, 手机识别码 mark from # where 类型='MTC'
)
select * from cte t where not exists (select 1 from cte where phone=t.phone and date>t.date)

/*
phone date mark
-------------------- ----------------------- --------
13755190211 2010-03-03 00:00:00.000 222
13755190211 2010-03-03 00:00:00.000 122
*/
qinzhuhua 2010-10-29
  • 打赏
  • 举报
回复
select T2.* from
(select Num,max(Date) as Date from (
select CallingNum as Num,Code,Date from tb where type='MOC'
union
select CalledNum as Num,Code,Date from tb where type='MTC') T GROUP BY Num)T1
,
(
select CallingNum as Num,Code,Date from tb where type='MOC'
union
select CalledNum as Num,Code,Date from tb where type='MTC') T2

where T2.Num=T1.Num and T2.Date=T1.Date
qinzhuhua 2010-10-29
  • 打赏
  • 举报
回复
晕啊,没有一个人是对的.......

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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