2017-06-21 49 views
0

我想按SQL Server中的一列聚合一個表。在SQL服務器中聚集一個由2列組成的大表

輸入:(。可能有2個百萬行,值1的數目可以由4增加至30,值2總是4位INT名1可以具有2K +不同的值)

Name1 (varchar), value1 (int), value2 (int) 
Racaw      1      1900 
Racaw      2      1100 
Racaw      3      1600 
Racaw      4      1200 
efvsef      1      1700 
efvsef      2      1200 
efvsef      3      1100 
efvsef      4      1000 
sdwyw      1      1900 
sdwyw      2      1100 
sdwyw      3      1600 
sdwyw      4      1200 
yubon      1      1700 
yubon      2      1200 
yubon      3      1100 
yubon      4      1000 

每個NAME1具有隻有4個「value1」。

輸出:

Name1 (varchar), value1 (int),     value2 (int), group_id 
Racaw     1      1900    1 
Racaw     2      1100    1 
Racaw     3      1600    1 
Racaw     4      1600    1 
efvsef     1      1700    2 
efvsef     2      1200    2 
efvsef     3      1000    2 
efvsef     4      1000    2 
sdwyw     1      1900    1 
sdwyw     2      1100    1 
sdwyw     3      1600    1 
sdwyw     4      1600    1 
yubon     1      1700    2 
yubon     2      1200    2 
yubon     3      1000    2 
yubon     4      1000    2 

所以,在輸出中,每名1通過柱VALUE2分組。

在每個「Name1」中,「value2」的數字可能非常大,例如, 500。

我想在每個Name1上嘗試value2的校驗和,但我無法在SQL Server中找到內置函數。

我試圖按名稱1,值1,值2排序表,但我不確定如何分配group_id,它可以用來標識name1上重複的組合值1和值2。

UPDATE

BECAUSE

Name1 (varchar), value1 (int),     value2 (int), 
Racaw     1      1900    
Racaw     2      1100    
Racaw     3      1600    
Racaw     4      1600    

被複制與

Name1 (varchar), value1 (int),     value2 (int), 
sdwyw     1      1900    
sdwyw     2      1100    
sdwyw     3      1600    
sdwyw     4      1600    

除了名1。它們具有相同的值1和值2。 因此,他們被分配相同的group_id標記出它們是重複的。

是否有一些內置函數可以根據name1的列組值計算校驗和?通過這種方式,可以很容易地找到重複的。

感謝,

+0

如何添加組號碼聚合?你有訂單的團體號碼? –

+0

如何添加組號? – user3448011

+0

組號應從1開始並連續。 – user3448011

回答

0

試試這個,

SELECT Name1, value1, value2, DENSE_RANK() OVER(ORDER BY Name1) AS 'group_id' 
FROM (SELECT DISTINCT Name1, value1, value2 FROM TableName) A 
+0

不,它不起作用,thx – user3448011

+0

我只是在查看更新的問題後更改了SQL,現在嘗試它,如果它工作。 – Jigar

+0

group_id不連續。 thx – user3448011

0

你提的問題是非常不清楚。你有兩組「期望的輸出」,但它們彼此衝突,關於組號的連續評論。我想你可能想在這裏使用DENSE_RANK,但很難肯定地說。

注意我以可消耗的格式發佈了示例數據,因此其他人可以輕鬆開始解決問題,而不必花費時間創建數據。這是你將來應該做的事情。

DECLARE @Something TABLE 
(
    name1 VARCHAR(20) 
    , value1 INT 
    , value2 INT 
) 

INSERT @Something 
(
    name1, 
    value1, 
    value2 
) 
VALUES 
('Racaw', 1, 1900), 
('Racaw', 2, 1100), 
('Racaw', 3, 1600), 
('Racaw', 4, 1200), 
('efvsef', 1, 1700), 
('efvsef', 2, 1200), 
('efvsef', 3, 1100), 
('efvsef', 4, 1000), 
('sdwyw', 1, 1900), 
('sdwyw', 2, 1100), 
('sdwyw', 3, 1600), 
('sdwyw', 4, 1200), 
('yubon', 1, 1700), 
('yubon', 2, 1200), 
('yubon', 3, 1100), 
('yubon', 4, 1000) 

SELECT name1, 
     value1, 
     value2 
     , DENSE_RANK() OVER(ORDER BY name1) 
     , RANK() OVER(ORDER BY name1) 
FROM @Something 
+0

我試過你的解決方案,它不起作用,重複的行被分配不同的group_id。 Thx,在這個例子中,應該只有2個不同的group_id。 「更新」部分顯示了這一點。 – user3448011

+0

我已經更新了OP,因此只有一個輸出是首選的,thx – user3448011

+1

您的示例數據中確切地有ZERO重複行。也許你需要更清楚地解釋你想要的輸出。 –

0

一種方法是將Value1和Value2列連接成每個Name1的字符串。您可以使用其他答案中提到的Dense_Rank

假設在@Sean Lange's answer創建的表,你可以使用串聯的值1和值2列:

SELECT DISTINCT S2.Name1, 
(
    SELECT CAST(S1.Value1 AS VARCHAR)+','+ CAST(value2 AS VARCHAR)+',' 
    FROM @Something S1 
    WHERE S1.Name1 = S2.Name1 
    ORDER BY S1.Name1, S1.Value1, S1.Value2 
    FOR XML PATH('') 
) v 
FROM @Something S2 

這將給:

Name1 v 
efvsef 1,1700,2,1200,3,1100,4,1000, 
Racaw 1,1900,2,1100,3,1600,4,1200, 
sdwyw 1,1900,2,1100,3,1600,4,1200, 
yubon 1,1700,2,1200,3,1100,4,1000, 

然後,您可以使用DENSE_RANK()來計算的GroupID值:

SELECT * 
FROM @Something s 
INNER JOIN 
(
    SELECT x.Name1 
     , DENSE_RANK() OVER(ORDER BY x.v) GroupID 
    FROM 
    (
     SELECT DISTINCT S2.Name1, 
     (
      SELECT CAST(S1.Value1 AS VARCHAR)+','+CAST(value2 AS VARCHAR)+',' 
      FROM @Something S1 
      WHERE S1.Name1 = S2.Name1 
      ORDER BY S1.Name1, S1.Value1, S1.Value2 
      FOR XML PATH('') 
     ) v 
     FROM @Something S2 
    ) x 
) r ON s.Name1 = r.Name1 
ORDER BY s.Name1