Sql server SQL Server选择random和not random
我有一个表,我想随机选择10行。但我还需要选择任何“销售”行。我只想要10行,可能有2行,可能有9行,我需要用随机行填充剩余的行。我只需要一个问题Sql server SQL Server选择random和not random,sql-server,random,nested,Sql Server,Random,Nested,我有一个表,我想随机选择10行。但我还需要选择任何“销售”行。我只想要10行,可能有2行,可能有9行,我需要用随机行填充剩余的行。我只需要一个问题 SELECT TOP 10 BookTitle, BookAuthor, BookCategory FROM TheTable ORDER BY newid() SELECT TOP 10 BookTitle, BookAuthor, BookCategory FROM TheTable WHERE BookCategory LIKE 'Sale%
SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM TheTable
ORDER BY newid()
SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM TheTable
WHERE BookCategory LIKE 'Sale%'
我不停地罢工,我可能是想得太多/太少了
谢谢。对于一张大桌子来说效率不是很高,但是
SELECT TOP 10 BookTitle,
BookAuthor,
BookCategory
FROM TheTable
ORDER BY CASE
WHEN BookCategory LIKE 'Sale%' THEN 0
ELSE 1
END,
newid()
如果您的表很大,您可能需要进行两次查询。一个用于获取销售商品,然后第二个用于获取随机非销售商品的“充值”数量(仅在需要时)。按类别选择10个,在子查询中选择10个随机。
按类别排列优先顺序
SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM (
SELECT TOP 10 BookTitle, BookAuthor, BookCategory, 0 as prio
FROM TheTable
WHERE BookCategory LIKE 'Sale%')
UNION ALL
SELECT TOP 10 BookTitle, BookAuthor, BookCategory, 1 As prio
FROM TheTable
TABLESAMPLE (50 ROWS)
) x
ORDER BY prio
我从@Remus的答案中选取了TABLESAMPLE
,因为使用大表显然要快得多。如果这是你的主要特点,就投他的票
然而,我调整了它表样本(50行)
,因为:
返回的实际行数可能会有很大差异。如果
如果指定一个较小的数字,例如5,则可能不会收到结果
在样品中
我刚刚测试并复制了这个。我还保留了前10名,因为我们最后只需要最多10名
此外,关于“随机性”的问题:
如果您真的需要对单个行进行随机采样,请修改
查询以随机筛选出行,而不是使用TABLESAMPLE
因此,如果需要真正的随机选择,那么您最初的
newid()
是正确的方法。组合两个查询是否有问题
SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM TheTable
ORDER BY newid()
WHERE BookCategory LIKE 'Sale%'
使用
表样本
。使用ORDER BY NEWID()
的简单方法将导致糟糕的性能,因为每个查询都必须扫描整个表并进行排序,只需选择10个随机行。内置的TABLESAMPLE语法将使用高效的IO页面采样提供所需的行数,并且样本的随机性足以满足日常使用。有关更多详细信息,请参阅
select top(10) BookTitle, BookAuthor, BookCategory
from (
SELECT TOP(10) BookTitle, BookAuthor, BookCategory
FROM TheTable
WHERE BookCategory LIKE 'Sale%'
UNION ALL
SELECT BookTitle, BookAuthor, BookCategory
FROM TheTable TABLESAMPLE (10 ROWS)) as theUnion;
请注意,这并不保证“随机”行中的任何一行不是“销售%”行之一,从而产生实际上的重复。如果您需要这样的排除,这是可能的,但更复杂,可能效率低下。如果有11个在售呢?那你想要随机的10个?嘿。。。我打字太慢了+1:)这种情况是一种巧妙的语言技巧,但结果非常糟糕:全表扫描、构建排序表、排序,然后获得前10名。对超过1M行的每个查询执行此操作,观察数据中心中的灯光变暗;)@RemusRusanu-是的,同意它不适用于大型表(但同样,表示例也不适用于小型表),了解所涉及的行数会很有用。是的,有点错误:如果只有5个项目在“出售”,那么它不会返回10行。因此,如果只有2行,您仍然希望从这两行中随机选择10行吗?您不在乎它是否会被重复的数据填充吗?+1表示TABLESAMPLE。我厚颜无耻地从你那里抄来的,但形式有所改变。你可能会感兴趣。此外,您的答案未能对非随机行进行优先级排序,因此无法保证结果是正确的。