我有以下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, 然而他的解决方案拉进了我不想做的每一行;只有分组(数量级更小)。
答案 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