Sql server SQL Server选择random和not random

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%

我有一个表,我想随机选择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 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。我厚颜无耻地从你那里抄来的,但形式有所改变。你可能会感兴趣。此外,您的答案未能对非随机行进行优先级排序,因此无法保证结果是正确的。