2016-11-15 162 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