2012-02-28 121 views
0

該合併數據鏈接到我的previous Qn獲取最高值或重複值

Table A: 
ID Rank Name 
1 100 Name1 
1 45 Name2 
2 60 Name3 
2 42 Name4 
2 88 Name5 
3 50 name6 
3 50 name7 

Table B: 
ID FileName 
1 fn1 
2 fn2 
3 fn3 

我要的是

1 fn1 name1 
2 fn2 name5 
3 fn3 name6,name7 

這裏是我的代碼,這並不處理duplciate以上的行列,所以我得到兩行的值爲3.

select B.*,A.Name 
LEFT JOIN (SELECT A.Id, MAX(A.Rank)as Rank 
    FROM A 
    GROUP BY A.Id 
    ) AS NewA 
      JOIN A 
       on A.Rank = NewA.Rank 
        AND A.ID = NewA.Id 
    on NewA.ID = B.ID 

如何修改此給我A.name分離用逗號分隔時候的行列是否相同?

感謝

+0

Wnat RDBMS試試您使用的? – 2012-02-28 03:19:33

+0

sql server 2008 R2 – user393148 2012-02-28 03:19:58

+0

Sql服務器組連接 - 這是一個頻繁的SO問題:http://stackoverflow.com/questions/941103/concat-groups-in-sql-server – 2012-02-28 03:24:12

回答

0

您將需要使用CTE壓平了這一點。

這應該直接插入到SQL中,並使用給出的數據作爲示例。顯然,你將需要更新的查詢爲您真實的數據,因爲這可能是不是你真正的模式

create table #tableA (ID int, [rank] int, name varchar(max)) 
insert into #tableA values(1,100,'Name1') 
insert into #tableA values(1,45,'Name2') 
insert into #tableA values(2,60,'Name3') 
insert into #tableA values(2,42,'Name4') 
insert into #tableA values(2,88,'Name5') 
insert into #tableA values(3,50,'Name6') 
insert into #tableA values(3,50,'Name7') 

create table #tableB (ID int, [FileName] varchar(max)) 
insert into #tableB values(1,'fn1') 
insert into #tableB values(2,'fn2') 
insert into #tableB values(3,'fn3') 

SELECT B.*,A.Name, ROW_NUMBER() OVER (PARTITION BY A.ID ORDER BY A.[rank]) AS RowNum 
INTO #RankedTable 
FROM #tableB as B 
    LEFT JOIN ( 
     SELECT A.Id, MAX(A.Rank)as Rank 
     FROM #tableA AS A 
     GROUP BY A.Id 
     ) AS NewA 
    JOIN #tableA AS A 
     on A.Rank = NewA.Rank 
      AND A.ID = NewA.Id 
    on NewA.ID = B.ID 

;WITH ConcatenationCTE (ID, [FileName], Name, RowNum) 
AS 
(
    SELECT ID, [FileName], Name, RowNum 
    FROM #RankedTable 
    WHERE RowNum = 1 
    UNION ALL 
    SELECT #RankedTable.ID, #RankedTable.[FileName], 
      ConcatenationCTE.Name + ',' + #RankedTable.Name AS Name, 
      #RankedTable.RowNum 
    FROM #RankedTable 
     JOIN ConcatenationCTE 
      ON ConcatenationCTE.ID = #RankedTable.ID 
       AND ConcatenationCTE.RowNum +1 = #RankedTable.RowNum 
) 
SELECT ConcatenationCTE.ID, [FileName], Name 
FROM ConcatenationCTE 
     JOIN 
    (SELECT ID, MAX(RowNum) AS RowNum 
     FROM ConcatenationCTE GROUP BY ID) AS FinalValues 
     ON FinalValues.ID = ConcatenationCTE.ID 
      AND FinalValues.RowNum = ConcatenationCTE.RowNum 
+0

謝謝你Justin .. – user393148 2012-02-28 03:47:31

+0

好吧,我測試了我的查詢,我剛剛更新了一組虛擬數據,它工作。讓我知道它是否有效或不合理。與往常一樣,用upvote表示你的讚賞並回答接受:) – 2012-02-28 03:56:30

+0

我會的。當然。讓我試試這個。謝謝。 – user393148 2012-02-28 03:59:45

1
;WITH x AS 
(
    SELECT ID, [Rank], Name, 
     rn = DENSE_RANK() OVER (PARTITION BY ID ORDER BY [Rank] DESC) 
     FROM dbo.TableA 
), y AS 
(
    SELECT x.ID, x.Name, f.[Filename] 
    FROM x INNER JOIN dbo.TableB AS f 
    ON x.ID = f.ID WHERE x.rn = 1 
) 
SELECT DISTINCT ID, [Filename], Names = STUFF((SELECT ',' + name 
    FROM y AS y2 WHERE y.ID = y2.ID 
    FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 1, '') 
FROM y 
ORDER BY ID; 
+3

PS如果你認爲這應該更容易編碼,你並不孤單!請投票選擇將「GROUP_CONCAT()」函數添加到SQL Server中,並解釋此功能將爲您節省時間,並防止您使用kludgy和複雜的解決方法來表達一個簡單而常見的需求:http://connect.microsoft .com/SQLServer/feedback/details/247118/sql-needs-version-of-mysql-group-concat-function – 2012-02-28 07:15:35

+0

+1。會做。謝謝Aaron。 – user393148 2012-02-28 20:09:43

2
select B.ID, 
     B.[FileName], 
     stuff((select ',' + A1.name 
       from TableA as A1 
       where B.ID = A1.ID and 
        A1.[Rank] = (select max(A2.[Rank]) 
           from TableA as A2     
           where A1.ID = A2.ID) 
       for xml path(''), type).value('.', 'varchar(max)'), 1, 1, '') as Names 
from TableB as B 

SE-Data

+0

+1。謝謝Mikael。我也嘗試過這個解決方案。它爲我工作。我已經將下面的解決方案集成到了我的項目中,所以我會繼續這樣做。太糟糕了,我不能選擇兩個答案。 :) – user393148 2012-02-28 20:09:10

+1

@ user393148你的選擇是#temp表?這可能會效率低得多。在實施或接受答案之前,您應該花時間解決問題,因爲第一個答案並不總是最好的。不要試圖從已接受的答案中拿走任何東西;有時只要滿足要求,性能或複雜性就不那麼重要了。但有時他們是(或者稍後,你將不得不重建它)。另一件事是,儘早接受答案使任何人都不願提出更好的解決方案。 – 2012-02-28 20:15:50

+0

@AaronBertrand:其實它碰巧發現我的代碼與#temp解決方案集成在一起時出現了另一個問題。所以我轉而使用Mikaels解決方案。 – user393148 2012-02-29 19:19:01