【问题标题】:SQL Server 2008 how to select top [column value] and random record?SQL Server 2008如何选择顶部[列值]和随机记录?
【发布时间】:2013-01-12 17:53:03
【问题描述】:

我使用的是SQL Server 2008,我想选择随机行记录,记录的总数取决于另一个表的列值,该怎么做?

我的SQL语句是这样的,但是错了..

select top b.number a.name, a.link_id 
from A a 
left join B b on b.link_id = a.link_id 
order by newid()

这是我的表格和预期结果。

表 A

name   link_id 
james  100
albert 100
susan  100
simon  101
tom    101    
fion   101

表 B

link_id   number
100       2
101       1

预期结果:

  • 第一次运行时,结果可能是:

    name   link_id
    james  100
    susan  100
    fion   101
    
  • 第二次结果可能是:

    albert 100
    susan  100
    simon  101
    
  • 第三次可能是:

    james  100
    albert 100
    fion   101
    

解释

参考表B,link_id:100,编号:2

意味着表A应该为link_id = 100选择2个随机记录

并且需要为link_id=101选择1条随机记录

【问题讨论】:

  • 我无法从描述和提供的示例数据中弄清楚,并查询 [Table B].number 与此相关。除了选择它之外,你的意思是对数字做任何事情吗?
  • @DWright: b.numberTOP 的参数,而不是SELECT
  • @Quassnoi:有帮助的澄清!
  • @heng heng - 你已经给出了 2 个漂亮的解决方案。我当然希望你能接受。

标签: sql-server select random


【解决方案1】:

您可以使用 ROW_NUMBER() 函数:

SELECT A.name, A.link_id
FROM(
SELECT name,link_id, ROW_NUMBER()OVER(PARTITION BY link_id ORDER BY NEWID()) rn
FROM dbo.tblA
) AS A
JOIN dbo.tblB AS B
ON A.link_id = B.link_id
WHERE A.rn <= B.number;

这里有一个 SqlFiddle 来展示这一点:http://sqlfiddle.com/#!3/92eac/2

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT  a.*
    FROM    b
    CROSS APPLY
            (
            SELECT  TOP (b.number) a.*
            FROM    a
            WHERE   a.link_id = b.link_id
            ORDER BY
                    NEWID()
            ) a
    

    另见:SQLFiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2011-08-11
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多