Cenário:
Você está trabalhando como desenvolvedor do SQL Server. Você é solicitado a fornecer dados aleatórios de amostra da tabela dbo.Customer. Você pode pedir para fornecer 100 linhas aleatórias ou algum percentual do total de dados da tabela. Qual consulta você usará para fornecer a saída necessária?Solução:
No post anterior, aprendemos como obter as n primeiras linhas da tabela. Podemos fornecer a contagem de linhas ou a porcentagem de registros que desejamos obter de uma tabela usando TOP em nossa consulta de seleção.Podemos usar a mesma cláusula Top, mas somos solicitados a fornecer os registros aleatórios , precisamos classificá-los aleatoriamente primeiro. Podemos usar a função newid() em ordem por cláusula para classificá-los aleatoriamente.
Vamos criar a tabela dbo.Customer com alguns dados de exemplo.
Create table dbo.Customer (Id int, FName VARCHAR(50), LName VARCHAR(50), CountryShortName CHAR(2)) GO insert into dbo.Customer Values ( 1,'Raza','M','PK'), (2,'Rita','John','US'), (3,'Sukhi','Singh',Null), (4,'James','Smith','CA'), (5,'Robert','Ladson','US'), (6,'Alice','John','US')
1) use NewID ( ) em Order by para obter registros aleatórios
Digamos que se estivermos interessados em obter 3 registros aleatórios da tabela dbo.Customer, podemos usar a consulta abaixo.
Select top 3 * From dbo.Customer order by NEWID()
Como obter registros aleatórios da tabela do SQL Server - Tutorial do SQL Server / TSQL |
você também pode usar percent se quiser, conforme mostrado abaixo
Select top 30 percent * From dbo.Customer order by NEWID()
Como obter registros aleatórios da tabela do SQL Server usando o Top Percent com NewID() - Tutorial do SQL Server / TSQL |
2) Usando o SISTEMA TABLESAMPLE
De acordo com o Microsoft Books Online "TABLESAMPLE SYSTEM retorna uma porcentagem aproximada de linhas e gera um valor aleatório para cada página física de 8 KB na tabela. Com base no valor aleatório de uma página e na porcentagem especificada na consulta, uma página é incluída na amostra ou excluída. Cada página incluída retorna todas as linhas no conjunto de resultados da amostra".
A partir daqui, você pode entender que, se tiver uma tabela pequena com poucas páginas , você pode não querer usar TableSample, pois incluirá ou excluirá a página inteira. Com poucos registros na tabela, você pode querer usar o método 1 e para tabelas grandes você pode usar TableSample.
Se eu executar a consulta abaixo na minha tabela dbo.Customer, às vezes não obterei registros e ao obter os registros, ele retornará todos os registros conforme são colocados em uma única página.
Select * From dbo.Customer tablesample (30 percent)
Você também pode usar as linhas desejadas com o exemplo de tabela, conforme mostrado abaixo. As linhas retornadas podem variar. você pode limitá-los usando top n na consulta de seleção.
Select * From dbo.Customer tablesample (2 rows)
Quando executei a consulta acima na tabela dbo.Customer com total de 6 linhas. Ele não me retornou nenhuma linha ou todas as seis.
Se você quiser limitar, você pode usar a consulta abaixo. Mais uma vez, sugiro usar TableSample com tabela grande onde você tem dados em várias páginas de dados.
Select top 2 * From dbo.Customer tablesample (2 rows)