2010-11-25 42 views
5

我具有以下表:SELECT DISTINCT用於數據組

等。換句話說,我有每個ID數據的組。您會注意到數據組(A,B)多次出現。我想要一個查詢,可以識別不同的數據組和它們編號,如:

DataID  Data 
101  A 
102  A 
102  B 
103  C 
104  D 

所以數據ID 102將類似於數據(A,B),數據ID 103將類似於數據(C),等等。爲了能夠以這種形式重寫我的原始表格:

ID DataID 
1 101 
2 102 
3 102 
4 103 
5 104 
6 102 

我該怎麼做?


PS。代碼生成的第一個表:

CREATE TABLE #t1 (id INT, data VARCHAR(10)) 
INSERT INTO #t1 
SELECT 1, 'A' 
UNION ALL SELECT 2, 'A' 
UNION ALL SELECT 2, 'B' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'B' 
UNION ALL SELECT 4, 'C' 
UNION ALL SELECT 5, 'D' 
UNION ALL SELECT 6, 'A' 
UNION ALL SELECT 6, 'B' 
+0

@lgreengreen - 您的預期產出排3 2的基礎是什麼? – 2010-11-25 10:27:41

+1

我很努力地看到你的意思/要求。 ID和DataID如何相關(如果有的話)?你有什麼機會重寫這個例子,除非它們指向相同的東西,否則在表格之間沒有重用值? – 2010-11-25 10:29:37

+0

由於ID 3在我的原始表中有數據(A,B),並且該數據組合已收到DataID 2. – thomaspaulb 2010-11-25 10:30:03

回答

3

我認爲你必須創建一個自定義的骨料會連接數據(在字符串CLR方法的情況下,建議PERF的原因)。 然後,我會按ID進行分組,並選擇不同於分組,添加row_number()函數或添加您所選擇的dense_rank()。無論如何,它應該看起來像這樣

with groupings as (
select concat(data) groups 
from Table1 
group by ID 
) 
select groups, rownumber() over() from groupings 
2

以下使用CASE的查詢將爲您提供下面顯示的結果。

從那裏開始,獲取不同的數據組並繼續進行應該不是真正的問題。

SELECT  
    id, 
    MAX(CASE data WHEN 'A' THEN data ELSE '' END) + 
    MAX(CASE data WHEN 'B' THEN data ELSE '' END) + 
    MAX(CASE data WHEN 'C' THEN data ELSE '' END) + 
    MAX(CASE data WHEN 'D' THEN data ELSE '' END) AS DataGroups 
FROM t1 
GROUP BY id 

ID DataGroups 
1 A 
2 AB 
3 AB 
4 C 
5 D 
6 AB 

但是,這種邏輯只適用於「數據」值既是固定的,又是已知的。

就你而言,你確實是這麼說的。但是,考慮到你也說他們是1000人,坦率地說,這將是一個可笑的前瞻性質疑:-)

上面的這個LuckyLuke的建議坦率地說是更通用的方式,關於在你的情況下實施解決方案。

0

從您的樣本數據(已加入失蹤2, 'A' 的元組,下面給出的重新編號(和uniqueified)數據:

with NonDups as (
select t1.id 
from #t1 t1 left join #t1 t2 
on t1.id > t2.id and t1.data = t2.data 
group by t1.id 
having COUNT(t1.data) > COUNT(t2.data) 
), DataAddedBack as (
    select ID,data 
    from #t1 where id in (select id from NonDups) 
), Renumbered as (
    select DENSE_RANK() OVER (ORDER BY id) as ID,Data from DataAddedBack 
) 
select * from Renumbered 

,並提供:

1   A 
2   A 
2   B 
3   C 
4   D 

我覺得再,這是一個關係劃分的問題,以便將此輸出的行與原始表中的行進行匹配。

0

只是爲了分享我自己現在使用的骯髒解決方案:

SELECT DISTINCT t1.id, D.data 
FROM #t1 t1 
CROSS APPLY ( 
    SELECT CAST(Data AS VARCHAR) + ',' 
    FROM #t1 t2 
    WHERE t2.id = t1.id 
    ORDER BY Data ASC 
    FOR XML PATH('')) 
D (Data) 

然後將模擬到LuckyLuke的解決方案。