2017-02-08 9 views
7

Я пытаюсь выяснить, как получить одну случайную строку, возвращаемую на одну учетную запись из таблицы. Таблица имеет несколько строк на одну учетную запись или, в некоторых случаях, только одну строку. Я хочу иметь возможность получить случайный результат в моем выборе, поэтому каждый день, когда я запускаю тот же оператор, я могу получить другой результат.Случайное значение SQL Server 2014 в группе

Это основа запроса:

select number, phonenumber 
from phones_master with(nolock) 
where phonetypeid = '3' 

Это результат выборки устанавливается

number   phonenumber  
-------------------------- 
4130772,  6789100949  
4130772,  6789257988 
4130774,  6784519098 
4130775,  6786006874 

В колонке под названием Number это учетная запись. Я хотел бы вернуть одну случайную строку. Поэтому, основываясь на наборе результатов теста выше, запрос должен возвращать 3 строки.

Любые предложения были бы весьма полезными. Я бил головой о стену с этим.

Благодаря

+2

Почему 'С (NOLOCK)'? Это означает «читать грязные данные», а не «не принимать никаких блокировок». Если у вас проблемы с блокировкой, подумайте о переходе на SNAPSHOT ISOLATION –

ответ

8

Вы можете использовать с галстуками в согласии с row_number()

Select Top 1 with ties * 
From YourTable 
Order by Row_Number() over (Partition By Number Order By NewID()) 

возвраты (например)

number phonenumber 
4130772 6789257988 
4130774 6784519098 
4130775 6786006874 
+3

'Top 1 with ties' Мне это нравится;) –

+1

@Prdp Хотел бы я взять кредит на концепцию, но я не настолько яркий. –

0

Если у вас есть другая таблица называемый account, где эти number's создаются/создаются, тогда вот один из способов: Cross Apply.

SELECT at.number, 
     cs.phonenumber 
FROM account_table at 
     CROSS apply(SELECT TOP 1 phonenumber 
        FROM phones_master pm 
        WHERE at.number = pm.number 
          AND phonetypeid = '3' 
        ORDER BY Newid()) cs (phonenumber) 

Также это рассматривается таблица number в account уникален.

Создание Index на number и phonetypeid в phones_master таблице должно улучшить производительность