导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

一个SQL语句的挑战,高手请进,送分!

anbywang 2003-01-16 11:11:05
有这么一个表TAB1,有mobile,name,no_flag等字段,有很多数据,no_flag为用户标记,有1代表英文用户,2为中文用户,3为企业用户(只有3种).每种用户数量都不同,要求查询出来的数据按no_flag=1的50条,再no_flag=2的50条,再no_flag=3的50条,这样数据交叉,如果no_flag的最小的用户数据已经交叉排列完,就另外两组再交叉,一直到数目第二的也排列完.SQL语句要怎么写?
例:
13011232251 张三1 1
.........
13011235562 李四0 1
13011235510 李四1 2
.........
13011235563 李四2 2
13011235564 李四3 3
.........
13011235565 李四4 3
13011235566 李四5 1
.........
13011235567 李四6 1
.........
.........
(每个no_flag值相同的为50条)
...全文
9 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
anbywang 2003-01-16
好的,先谢了,我也吃饭去:)
等你的佳音,这个问题困扰我N天了(人太笨)
回复
Chiff 2003-01-16
我明白你的意思了。你希望在后四位相同的里面随机取。吃完饭再说:)
回复
anbywang 2003-01-16
TO Chiff(~o~)
可以不必随机选数据(我不知怎么样才能随机),
只要能派对就可以了,因为我派对之后会做一个标记,
让它们不可以再次派对的.
请指点.
回复
Chiff 2003-01-16
是先随机选数据,然后找接近,还是先找最接近的,再随机选?

如果先找最接近的,那可能就不是随机了,对吧?
回复
anbywang 2003-01-16
我选择出来的数据会有这种情况:
13070990000 62500000
13189100000 62500000
13068780000 62500000
13070990001 62500001
13189100001 62500001
13068780001 62500001
13070990002 62500002
13189100002 62500002
13068780002 62500002
13070990003 62500003
怎样才能避免呢?
回复
anbywang 2003-01-16
在这里再请教Chiff(~o~)一个问题:
有这么一个表(比方叫Tab1),有一字段名为mobile,代表手机号码(有不同的手机号码,联通和香港的),另一字段名为No_sort,代表号码种类(定义3为联通,2为香港),当然还有其它的一些字段.问题是:怎么样从Tab1中随机选取20个号码(10对),即10个联通号码(No_sort为3),10个香港号码(No_sort为2),且联通和香港号码后面几位尽可能的接近,(比方最好后面4位相同,没有的话3位相同,2位,1位).请教要怎么写这个SQL语句,用什么方式好呢?
回复
anbywang 2003-01-16
Chiff(~o~)
谢谢,你的方法完全可以,高手啊!敬礼:)
对,我就是要这样的结果,我是做到了,
但走了很多弯路,谢谢指点!
回复
Chiff 2003-01-16
楼主应该是想要:
先显示50条no_flag为1的记录,
接着显示50条no_flag为2的记录,
再显示50条no_flag为3的记录;

完了,接着又显示50条no_flag为1的记录
......


回复
icevi 2003-01-16
完全看不懂也~
回复
Chiff 2003-01-16
select mobile,name,no_flag,n=identity(int,1,1)
into #t
from TAB1
order by no_flag

select mobile,name,a.no_flag
from #t a,(select no_flag,n=min(n) from #t group by no_flag) as b
where a.no_flag = b.no_flag
order by ceiling((a.n - b.n)/50),a.no_flag
回复
anbywang 2003-01-16
http://expert.csdn.net/Expert/topic/1297/1297269.xml?temp=.3051111

请Chiff(~o~)去看看,
就是那个问题,但有点不同.
回复
Chiff 2003-01-16
你先看这个能否符合你的需要。
回复
Chiff 2003-01-16

--先随机选十对值,将符合条件的记录列出来
select a.mobile,b.lastch,a.no_sort,n=identity(int,1,1)
into #t
from tab1 a,
(select top 10 lastch=right(mobile,4)
from tab1
group by right(mobile,4)
having count(distinct no_sort) > 1
order by newid()
) as b
where right(mobile,4) = b.lastch
order by b.lastch,a.no_sort

--从符合条件的记录中随机选十对号码
select a.mobile,a.no_sort
from #t a,(select lastch,no_sort,minn=min(n),maxn=max(n) from #t group by lastch,no_sort) as b
where a.n = b.minn+cast((b.maxn-b.minn)*rand() as int)
order by a.lastch,a.no_sort

如果你的数据足够多的话,这样可以,效率较高。但是如果数据不足,可能会造成结果少于十对号码的情况。我再改改!
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告