2017-02-08 21 views
7

Bir tablodan hesap başına tek bir rasgele satırın nasıl alınacağını anlamaya çalışıyorum. Tabloda hesap başına birden fazla satır veya bazı durumlarda yalnızca tek bir satır vardır. Seçimlerimde rastgele bir sonuç elde edebilmek istiyorum, böylece her gün aynı ifadeyi çalıştırıyorum farklı bir sonuç elde edebilirim.SQL Server 2014 Gruptaki Rasgele Değer

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

Bu sütun Number hesabı olarak adlandırılan bir örnek bir sonucudur

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

ayarlanır:

Bu sorgu temelidir. Tek rastgele bir sıra döndürmek istiyorum. Yani, yukarıdaki örnek sonuç temelinde, sorgu 3 satır döndürmelidir.

Her türlü öneri çok takdir edilecektir. Kafamı duvara çarptıracağım. Başka bir masa varsa

Teşekkür

+2

Neden '(nolock)' İLE geliştirmek gerekir phones_master tablodaki bir number üzerine Index ve phonetypeid oluşturma? Bu "kirli verileri oku" anlamına gelir, "herhangi bir kilit almayın" değil. Kilitleme sorunlarınız varsa, SNAPSHOT ISOLATION –

cevap

8

Sen ROW_NUMBER() (örneğin)

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

İade

number phonenumber 
4130772 6789257988 
4130774 6784519098 
4130775 6786006874 
+3

'Top 1 ile bağlantıyı değiştirmeyi tercih ediyorum;) –

+1

@Prdp İstek kavramı için kredi alabilirdim, ancak o kadar parlak değilim. –

0

uyum içinde TIES İLE kullanabilirsiniz account denen, buradaki number's oluşturulur/oluşturulduktan sonra Cross Apply kullanarak tek yoldur.

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) 

Ayrıca, bu number yılında account masa tektir düşünmektedir.

performansı