簡體   English   中英

連接和刪除多行重復數據

[英]concatenate and de-dupe multiple rows

我有以下格式的一些傳入行。

| Col1 | Col2 | Col3 |
| 1    | A    | 1    |
| 1    | A    | 1,2  |
| 1    | A    | 1,3  |
| 1    | A    | 2,4  |

所需的outputsql是

| Col1 | Col2 | Col3    |
| 1    | A    | 1,2,3,4 |

基本上,基於Col1和Col2對所有行進行分組,然后連接並從Col3中刪除重復項。

SELECT COL1, COL2, {?????}
FROM TABLEA
GROUP BY COL1, COL2;

我現在不能想太多。 任何指針將不勝感激。 我傾向於WX2數據庫,但任何符合ANSI的代碼段都將有所幫助。

對於SQL Server:首先使用STUFF方法和INSERT INTO CTE表連接所有col3值。基於此CTE表,基於CTE表將所有行單獨分割為單列。最后借助STUFF連接所有DISTINCT字符串。

 CREATE TABLE #table ( Col1 INT ,   Col2 VARCHAR(10) , Col3 VARCHAR(10))
 INSERT INTO #table ( Col1  ,   Col2  , Col3 )
 SELECT  1   , 'A'   , '1'  UNION ALL 
 SELECT  1   , 'A'   , '1,2' UNION ALL
 SELECT  1   , 'A'   , '1,3'  UNION ALL
 SELECT  1   , 'A'   , '2,4' 

 ;WITH CTEValues ( Colval ) AS
 (
   SELECT STUFF ( ( SELECT ',' +  Col3 FROM #table T2 WHERE T2.Col2 =  
                T1.col2 FOR XML PATH('') ),1,1,'') 
   FROM #table T1 
   GROUP BY Col2
 )

 SELECT * INTO #CTEValues
 FROM CTEValues

 ;WITH CTEDistinct ( SplitValues , SplitRemain ) AS
 (
  SELECT SUBSTRING(Colval,0,CHARINDEX(',',Colval)),    
         SUBSTRING(Colval,CHARINDEX(',',Colval)+1,LEN(Colval))
  FROM #CTEValues
  UNION ALL
  SELECT CASE WHEN CHARINDEX(',',SplitRemain) = 0 THEN SplitRemain ELSE  
                   SUBSTRING(SplitRemain,0,CHARINDEX(',',SplitRemain)) END, 
         CASE WHEN CHARINDEX(',',SplitRemain) = 0 THEN '' ELSE                               
        SUBSTRING(SplitRemain,CHARINDEX(',',SplitRemain)+1,LEN(SplitRemain))          
        END
  FROM CTEDistinct
  WHERE SplitRemain <> ''
 )

  SELECT STUFF ( ( SELECT DISTINCT ',' +  SplitValues FROM CTEDistinct T2  
  FOR XML PATH('') ),1,1,'') 

您可以嘗試使用轉置或串聯功能。 困難來自於這樣的事實,即col3是varchar,需要進行轉換才能獲得不同的值。 使用MySQL:

SELECT col1, col2, GROUP_CONCAT(DISTINCT col3) AS col3 FROM
(SELECT col1, col2, CONVERT(SUBSTR(col3, 1), UNSIGNED INTEGER) AS col3 FROM (
SELECT 1 AS col1, 'A' AS col2, '1' AS col3 UNION ALL
SELECT 1 AS col1, 'A' AS col2, '1,2' AS col3 UNION ALL
SELECT 1 AS col1, 'A' AS col2, '1,3' AS col3 UNION ALL  
SELECT 1 AS col1, 'A' AS col2, '2,4' AS col3
) AS t
UNION ALL
SELECT col1, col2, CONVERT(SUBSTR(col3, 3), UNSIGNED INTEGER) AS col3 FROM (
SELECT 1 AS col1, 'A' AS col2, '1' AS col3 UNION ALL
SELECT 1 AS col1, 'A' AS col2, '1,2' AS col3 UNION ALL
SELECT 1 AS col1, 'A' AS col2, '1,3' AS col3 UNION ALL  
SELECT 1 AS col1, 'A' AS col2, '2,4' AS col3
) AS t1
) AS t2
WHERE col3 <> 0

結果:

col1 | col2 | col3 
1    |   A  | 1,2,3,4

對於Postgres,請使用以下命令:

select col1, col2, string_agg(distinct col3, ',') as col3
from (
   select col1, col2, x.col3
   from tablea, unnest(string_to_array(col3, ',')) as x(col3)
) t
group by col1, col2;

除了string_to_array()string_agg()函數外,這基本上符合ANSI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM