如何在SQL Server中使用随机聚合函数执行分组?

时间:2011-07-11 12:48:19

标签: sql sql-server linq-to-sql

我有以下SQL:

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

我的两个聚合函数列为Count和Average,这很明显。我想要做的是从“消息”列中返回每个分组的随机行。

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

我认为我需要创建一个自定义聚合函数,但它们看起来非常过分,我想知道在尝试之前是否有更简单的方法。我尝试了一个CLR聚合函数,但由于它们的dll性质,数据库在实例之间不会轻易移植。

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

我在这里看到了Marc Gravell关于随机行的想法: Random row from Linq to Sql, 然而他的解决方案拉进了我不想做的每一行;只有分组(数量级更小)。

1 个答案:

答案 0 :(得分: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