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

Geo*_*rge 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我已经看到了Marc Gravell关于随机行的想法: 从Linq到Sql的随机行,但是他的解决方案拉入了我不想做的每一行; 只有分组(数量级更小)

gbn*_*gbn 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
Run Code Online (Sandbox Code Playgroud)