Sql 从考虑了权重的记录中选择前1名

Sql 从考虑了权重的记录中选择前1名,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我已经在这里看到这个帖子了http://stackoverflow.com/questions/1398113/sql-select-one-row-randomly-but-taking-into-account-a-weight,但没办法解决。我把“东西”放在哪里?为什么他们不使用NEWID而不是RND 餐桌用品 id item weight location 1 ball 1 Wyoming 2 cup

我已经在这里看到这个帖子了http://stackoverflow.com/questions/1398113/sql-select-one-row-randomly-but-taking-into-account-a-weight,但没办法解决。我把“东西”放在哪里?为什么他们不使用NEWID而不是RND

餐桌用品

id     item       weight       location
1      ball       1            Wyoming
2      cup        2            Alaska
3      sock       1            Idaho
4      car        3            Miami
5      hot girl   5            Brazil
根据上面提到的那篇文章,我应该这样做

SELECT      TOP 1 t.*
FROM        @Table t
INNER JOIN (SELECT t.id, sum(tt.weight) AS cum_weight
            FROM        @Table t
            INNER JOIN  @Table tt ON  tt.id <= t.id
            GROUP BY    t.id) tc
        ON  tc.id = t.id,
           (SELECT  SUM(weight) AS total_weight FROM @Table) tt,
           (SELECT  RAND() AS rnd) r
WHERE       r.rnd * tt.total_weight <= tc.cum_weight
ORDER BY    t.id ASC
我想做上述工作,但以这种方式:

SELECT TOP (1) from stuff WHERE blahblahblah AND (location='Brazil' OR location='Wyoming' OR location='Brazil') AND (weight <= cum_weight) ORDER BY NEWID()

我只是猜测我可以使用NEWID,而不是被迫使用RND。你可以通过从累积和中取样,而不是从记录中取样来实现这一点。其思想是获取权重的累积和,然后获取一个最大权重的随机值,最后查看哪个记录在该随机值周围具有累积和。SQL看起来像:

select top 1 t.*
from (select t.*, cumulative_sum(weight) as cumweight,
             sum(weight) over (partition by NULL) as totalweight
      from t
     ) t
where rand()*(totalweight+1) < cumweight
order by cumweight desc
这样做的目的是创建一个累积权重,然后创建一个随机变量,直至权重的总和。选择累积重量小于累积重量的最后一个记录。+1只是为了确保可以选择任何记录,即使是最后一条记录

在SQL Server 2012中,您可以使用按空排序的分区上的和来计算累积和

在SQL Server 2012中,您可以使用: 选择Top1T* 从select t中,按NULL order by weight作为cumweight对分区进行sumweight, 分区上的sumweight按NULL作为totalweight 从t T 其中randtotalweight+1
不幸的是,SQL Server 2008不支持此语法。在该数据库中,您需要进行自联接,这是您从原始文章中提取的查询。

您能用英语解释一下您要做什么吗?您的查询成功地获取了一组累积总和小于给定权重的记录,并对它们进行了随机排序。这似乎没有什么用处。我试图在考虑权重的情况下,为每个查询随机选择一行。权重较高的行集比权重较低的行出现的频率更高。5的重量比1的重量大5倍。如果有多行以相同的权重满足该场景行,则从该组中选择一个行集。快速和肮脏的东西会好的,我不需要它在统计上是完美的。请不要在你的标题前面加MSSQL之类的前缀。这就是这些标记的用途。累积_sumweight作为cumweight,sumweight over partition by NULL作为t的totalweight。累计金额。这不是一个函数。如何计算重量的累计总和?对不起,是的,我使用SQL 2012进行计算。当我试着运行这个程序时,我得到一个错误“cumulative_sum”不是一个公认的内置函数名cumulative_sum是一个概念性的想法。正确的语法是SUMvar over partition by NULL order by。你把我弄丢了,我重写了代码,我被卡在了这一点上。您可以按部分参考订单中的重量。我应该用什么来代替“累积重量作为干重”?谢谢你的帮助。我运行了一些查询,到目前为止看起来不错。现在,我将创建一个循环并插入一个临时表中,以查看分发情况。