2016-11-15 104 views
1

我有这个表:选择独特的领域

TableA 
---------------- 
ID (pk) Name 
1   A 
2   B 
3   C 
4   A 
5   D 
6   A 
7   B 
8   A 
9   D 
10  C 
.... 

我需要随机与SELECT TOP 5 ID, Name FROM TableA 与名称必须是5个记录中是唯一的提取。

我想:

;WITH group 
AS 
(
    SELECT ID, Name, 
      ROW_NUMBER() OVER (PARTITION BY Name ORDER BY NewId()) rn 
    FROM TableA 
) 
SELECT ID, Name 
FROM group 
WHERE rn = 1 

但每次我有完全一样的结果。

我需要随机选择ID的所有值,确保每个记录的名称始终不同。

我希望问题是可以理解的。有任何想法吗?

找到了解决办法。它似乎工作!

;WITH group 
AS ( 
SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY NewId()) rn FROM TableA) 
SELECT top 5 ID, Name, NewId() [NewId] 
FROM group 
WHERE rn = 1 
ORDER BY [newid] 
+0

您的查询工作的SQL Server 2012上刚刚renaming'group'为'[组]'。每次运行不同的结果 – Horaciux

+0

对于SQL Server 2014,它不起作用。 – MoS

+0

请避免张贴您的解决方案作为问题的一部分。相反,回答你自己的问题并接受你自己的答案。这样,人们就会知道问题已经解决。 –

回答

0
CREATE TABLE #test(ID INT ,Name VARCHAR(1)) INSERT INTO #test(ID ,Name) 
SELECT 1,'A' UNION ALL SELECT 2,'B' UNION ALL SELECT 3,'C' UNION ALL 
SELECT 4,'A' UNION ALL SELECT 5,'D'UNION ALL SELECT 6,'A' UNION ALL 
SELECT 7,'B' UNION ALL SELECT 8,'A'UNION ALL SELECT 9,'D' UNION ALL 
SELECT 10,'C' 

SELECT T1.ID ,T1.Name FROM #test T1 
JOIN (SELECT TOP 5 Name FROM #test T2 ORDER BY NEWID() 
) A ON T1.Name = A.Name ORDER BY A.Name 
+0

这不保证唯一的名称。 –

+0

我需要保证每次运行select时所有记录中的名称都是唯一的。 – MoS

1

也许问题是,虽然newid()是随机的,可能往往是连续的。这是否解决了这个问题?

WITH g as (
     SELECT ID, Name, 
      ROW_NUMBER() OVER (PARTITION BY Name ORDER BY RAND(CHECKSUM(NewId()))) as rn 
     FROM TableA 
    ) 
SELECT ID, Name 
FROM g 
WHERE rn = 1; 
+0

相同结果:-( – MoS

0
;WITH group 
AS 
(
    SELECT ID, Name, 
      ROW_NUMBER() OVER (PARTITION BY Name ORDER BY NewId()) rn 
    FROM TableA 
) 
SELECT top 5 ID, Name, NewId() [NewId] 
FROM group 
WHERE rn = 1 
ORDER BY [newid] 
+0

现在是否适用于您?它与您发布的内容相同,但添加了“ORDER BY”,这对我来说没有任何意义,它是以相同的结果集排序。 – Horaciux