带附加条件的NewID()用法(downmoon)

SQL随机取样
本文解决了一个具体的业务需求:从数据库中随机选取每个用户的单一产品记录,并确保每次选取的产品ID不重复。介绍了两种实现方法,包括使用ROW_NUMBER()窗口函数。

前天碰到一业务需求,难倒了团队成员,

表结构如下:

<!-- {cps..0}--> CREATE TABLE [ dbo ] . [ Product ] (
[ P_ID ] [ bigint ] IDENTITY ( 1 , 1 ) NOT NULL ,
[ P_Name ] [ nvarchar ] ( 255 ) NULL ,
[ CategoryID1 ] [ int ] NULL ,
[ CategoryID2 ] [ int ] NULL ,

[ CategoryID3 ] [ int ] NULL ,

[ P_SingleIntro ] [ nvarchar ] ( 200 ) NULL ,

[ LoginID ] [ nvarchar ] ( 50 ) NULL ,

CONSTRAINT [ PK_Product ] PRIMARY KEY CLUSTERED
(
[ P_ID ] ASC
)

需要随机列出表中每位用户(loginid)的一个产品,每次列出时随机值不重复。

于是考虑用newid()

<!-- {cps..1}--> select max (P_ID) as P_ID,loginID from product
group by loginid order by NewID ()

结果每次取到的P_ID都是相同的! 不符合需求

再修改如下:

<!-- {cps..2}--> select P_ID,LoginID,P_Name,P_SingleIntro from product where P_ID in
(
select ( select top 1 p_id from product as b where b.loginid = c.loginid order by newid ()) as p_id
from ( select top 10000 a.loginID from product as a group by a.loginid order by NewID ()) as c
)
-- 假定取前10000个用户

OK!!!!(就是性能寒碜了点!^_^ )

感谢尘尘
在SQL 2005/2008下可以这么做。


select P_ID,LoginID,P_Name,P_SingleIntro from (select P_ID,LoginID,P_Name,P_SingleIntro, ROW_NUMBER() over(partition by loginID order by new) rn from (select *,NEWID() new from Product) as temp) te where rn=1 and LoginID is not null and Len(loginID)>0 order by loginid asc

助人等于自助! 3w@live.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值