2012-02-28 43 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