如何在sql中根据某一列随机取记录

mircley2002 2012-08-07 12:54:35
按每个人随机取5条记录如何实现?

举例:张三 随机5条
李四 随机5条
............


select top 5 from tb where username = '张三' order by NEWID()
人很多,不可能根据以上语句更改username一条一条语句执行,求助各位高手!谢谢

...全文
555 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
mircley2002 2012-08-09
  • 打赏
  • 举报
回复
无解了吗
ryanwus 2012-08-09
  • 打赏
  • 举报
回复
如果是我做,估计会用rand()生成随机数,再用排序的序列匹配随机数~~~
mircley2002 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

引用 18 楼 的回复:

为毛结果返回都感觉错乱了呢,列已经不是原来的列了!

私聊毛线, 速度慢是必须的。
但应该不会乱,语法是对的。你在给嫂子的分分,我给你写个稍微高效的。
[/Quote]

快写快写,必须高分!1!
Enagle_Wang 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
引用 18 楼 的回复:

为毛结果返回都感觉错乱了呢,列已经不是原来的列了!

私聊毛线, 速度慢是必须的。
但应该不会乱,语法是对的。你在给嫂子的分分,我给你写个稍微高效的。
[/Quote]
哈哈 你从了我,分都给你啦
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

为毛结果返回都感觉错乱了呢,列已经不是原来的列了!
[/Quote]
私聊毛线, 速度慢是必须的。
但应该不会乱,语法是对的。你在给嫂子的分分,我给你写个稍微高效的。
gogodiy 2012-08-07
  • 打赏
  • 举报
回复
MSSQL2005及以上版本:

;with aaa as
(
select row_number() over(partition by username order by newid()) as rowindex,*
from tb with(nolock)
)
select * from aaa where rowindex<5

mircley2002 2012-08-07
  • 打赏
  • 举报
回复
求嫂子私聊! 呵呵
mircley2002 2012-08-07
  • 打赏
  • 举报
回复
为毛结果返回都感觉错乱了呢,列已经不是原来的列了!
wobuainiyes 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SQL code
select
*
from
(select px=row_number()over(partition by username order by newid()),* from tb)t
where
px<=5
[/Quote]

为毛嫂子回帖如此迅速呢?
mircley2002 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

SQL code
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([id] INT,[name] VARCHAR(4))
INSERT [tb]
SELECT 1,'张三' UNION ALL
SELECT 2,'张三' UNION ALL
SELECT 3,'张三' UN……
[/Quote]

执行效率很低啊,结果出不来,我取消执行返回部分结果,但username列怎么都出现两个名字了,这样显示(张三,李四)!
haitao 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

这种 row_number()over(partition by username order by newid()) 做法
在很多连接并发取时,会不会锁死?

select 你锁个毛线团啊
[/Quote]

因为我想到的需求是:取了立即更新为已使用。。。。
目前能做到 每次都取可用的里面最小的
为了避免重复了,还是想每个连接都取可用记录里的随机的一行,撞车的概率会比都取最小的低很多
以学习为目的 2012-08-07
  • 打赏
  • 举报
回复

IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([id] INT,[name] VARCHAR(4))
INSERT [tb]
SELECT 1,'张三' UNION ALL
SELECT 2,'张三' UNION ALL
SELECT 3,'张三' UNION ALL
SELECT 4,'张三' UNION ALL
SELECT 5,'张三' UNION ALL
SELECT 6,'张三' UNION ALL
SELECT 7,'李四' UNION ALL
SELECT 8,'李四' UNION ALL
SELECT 9,'李四' UNION ALL
SELECT 10,'李四' UNION ALL
SELECT 11,'李四' UNION ALL
SELECT 12,'李四' UNION ALL
SELECT 1,'王五' UNION ALL
SELECT 2,'王五' UNION ALL
SELECT 3,'王五' UNION ALL
SELECT 4,'王五' UNION ALL
SELECT 5,'王五' UNION ALL
SELECT 6,'王五' UNION ALL
SELECT 7,'王五'
--------------开始查询--------------------------
SELECT *
FROM
(SELECT *, rn= row_number () OVER (PARTITION BY USERNAME ORDER BY NEWID ()) FROM [tb]
) AS t
WHERE rn <= 5
ORAClE SE 2012-08-07
  • 打赏
  • 举报
回复
----ORACLE语法---
WITH t AS (
SELECT 1 ID,'张三' NAME FROM dual UNION ALL
SELECT 2,'张三' FROM dual UNION ALL
SELECT 3,'张三' FROM dual UNION ALL
SELECT 4,'张三' FROM dual UNION ALL
SELECT 5,'张三' FROM dual UNION ALL
SELECT 6,'张三' FROM dual UNION ALL
SELECT 7,'李四' FROM dual UNION ALL
SELECT 8,'李四' FROM dual UNION ALL
SELECT 9,'李四' FROM dual UNION ALL
SELECT 10,'李四' FROM dual UNION ALL
SELECT 11,'李四' FROM dual UNION ALL
SELECT 12,'李四' FROM dual UNION ALL
SELECT 1,'王五' FROM dual UNION ALL
SELECT 2,'王五' FROM dual UNION ALL
SELECT 3,'王五' FROM dual UNION ALL
SELECT 4,'王五' FROM dual UNION ALL
SELECT 5,'王五' FROM dual UNION ALL
SELECT 6,'王五' FROM dual UNION ALL
SELECT 7,'王五' FROM dual )
SELECT ID,NAME FROM (
SELECT ID,NAME,row_number()over(PARTITION BY NAME ORDER BY ID ) rn FROM t )C
WHERE C.RN<=5
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 5 楼 的回复:

SQL code
SELECT *
FROM (
SELECT row_id= row_number ()OVER (PARTITION BY username ORDER BY NEWID ()), * FROM tb
) t
WHERE row_id <= 5


按您的方法,执行不出结果出来啊!
[/Quote]
执行不出结果 是什么意思?
一直在执行?
有多少数据量?这个效率是不高,呵呵
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([id] INT,[name] VARCHAR(4))
INSERT [tb]
SELECT 1,'张三' UNION ALL
SELECT 2,'张三' UNION ALL
SELECT 3,'张三' UNION ALL
SELECT 4,'张三' UNION ALL
SELECT 5,'张三' UNION ALL
SELECT 6,'张三' UNION ALL
SELECT 7,'李四' UNION ALL
SELECT 8,'李四' UNION ALL
SELECT 9,'李四' UNION ALL
SELECT 10,'李四' UNION ALL
SELECT 11,'李四' UNION ALL
SELECT 12,'李四' UNION ALL
SELECT 1,'王五' UNION ALL
SELECT 2,'王五' UNION ALL
SELECT 3,'王五' UNION ALL
SELECT 4,'王五' UNION ALL
SELECT 5,'王五' UNION ALL
SELECT 6,'王五' UNION ALL
SELECT 7,'王五'
--------------开始查询--------------------------
SELECT *
FROM (
SELECT *, row_id= row_number () OVER (PARTITION BY NAME ORDER BY NEWID ()) FROM [tb]
) AS t
WHERE row_id <= 5
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
求高手指点啊
[/Quote]
#6楼的代码试了没?
mircley2002 2012-08-07
  • 打赏
  • 举报
回复
求高手指点啊
mircley2002 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

SQL code
SELECT *
FROM (
SELECT row_id= row_number ()OVER (PARTITION BY username ORDER BY NEWID ()), * FROM tb
) t
WHERE row_id <= 5
[/Quote]

按您的方法,执行不出结果出来啊!
  • 打赏
  • 举报
回复
需要在where中指定username为哪个,否则结果有问题
  • 打赏
  • 举报
回复
select
*
from
(select px=row_number()over(partition by username order by newid()),* from tb)t
where px<=5 and username=N'张三'
加载更多回复(5)

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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