Выбор 5 лучших уникальных строк, отсортированных случайным образом в SQL Server 2005? - PullRequest
0 голосов
/ 06 сентября 2010

У меня есть таблица в SQL Server 2005, которая выглядит как

1 | bob | joined
2 | bob | left
3 | john | joined
4 | steve | joined
5 | andy | joined
6 | kyle | joined

То, что я хочу, это дать кому-то возможность повысить активность 5 случайных пользователей (показывая их последнюю активность)

Пример: я хочу вернуть результаты 1, 3, 4, 5, 6 - или - 2, 3, 4, 5, 6 - но никогда - 1, 2, 3, 4, 5 (потому что 1 и 2 действия от одного и того же пользователя, и я не хочу, чтобы он появлялся дважды за счет другого уникального пользователя, у которого могла бы отображаться его активность)

Я пытаюсь что-то вроде SELECT TOP(5) FROM table ORDER BY NEWID(), чтобы получить топ-5 и случайный аспект, но когда я пытаюсь включить UNIQUE или DISTINCT в любом месте (чтобы остановить получение обеих строк 1 и 2), я получаю ошибки SQL я понятия не имею, как прогрессировать

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Использование CTE:

WITH cte AS (
   SELECT t.id,
          t.name,
          t.txt,
          ROW_NUMBER() OVER(PARTITION BY t.name
                                ORDER BY NEWID()) AS rank
     FROM TABLE t)
  SELECT TOP 5
         c.id, 
         c.name,
         c.txt
    FROM cte c
   WHERE c.rank = 1
ORDER BY NEWID()

Не эквивалент CTE:

  SELECT TOP 5
         c.id, 
         c.name,
         c.txt
    FROM (SELECT t.id,
                 t.name,
                 t.txt,
                 ROW_NUMBER() OVER(PARTITION BY t.name
                                       ORDER BY NEWID()) AS rank
            FROM TABLE t) c
   WHERE c.rank = 1
ORDER BY NEWID()
1 голос
/ 06 сентября 2010
select top 5 name, id from (
    select top 99.999 PERCENT name,id, NEWID() dummy from sysobjects
    order by dummy) dummyName

Это работает, просто замените имена столбцов и таблицы на те, которые вам нужны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...