Как создать группу с функцией случайного агрегирования в SQL Server? - PullRequest
2 голосов
/ 11 июля 2011

У меня есть следующий 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 немного многословнотакже, но я не могу найти способ использовать их в своей группе по запросу.

Я видел идею Марка Гравелла о случайных строках здесь: Случайная строка от Linq до Sql Однако его решение тянет в каждом ряду, что я не хочу делать;только группировка (которая на порядки меньше.)

1 Ответ

5 голосов
/ 11 июля 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...