2011-07-11 110 views
2

我有以下SQL:如何使用SQL Server中的随机聚合函数来执行分组?

select Username, 
    COUNT(DISTINCT Message) as "Count", 
    AVG(WordCount) as "Average", 
    RAND(Message) //Essentially what I want to do 
from Messages 
group by Username 
order by "Count" desc 

我的两个聚集功能列计数和平均水平,这是显而易见的。我想要做的也是从'消息'列中的每个分组中返回一个随机行。

我已经在Linq2SQL中写了这个查询,但是它不支持随机数。

我想我需要创建一个自定义的聚合函数,但它们看起来很漂亮,我想知道在我尝试之前是否有更简单的方法。我会尝试一个CLR聚合函数,但是由于它们的dll本质,数据库不会像实例那样轻松地移植。

我也知道在SQL中使用每行随机数字也有点冗长,但是我找不到在查询中使用它们的方法。

我见过马克Gravell对这里随机行的想法: Random row from Linq to Sql, 但是他的解决办法,我不想做的每一行中拉;只有分组(数量级更小)

回答

5
select Username, 
    COUNT(DISTINCT m.Message) as "Count", 
    AVG(m.WordCount) as "Average", 
    FOO.Message 
from 
    Messages m 
    cross apply 
    (select TOP 1 Message, Username 
     from Messages m2 
     WHERE m2.Username = m.Username 
     order by newid() 
    ) FOO 
group by m.Username, FOO.Message 
order by "Count" desc 
+0

谢谢!好的解决方案 – George

+1

+1 - “CROSS APPLY”的实际用途有限,所以很高兴看到一个 – JNK