5

我有下表:

ID  Data
1   A
2   A
2   B
3   A
3   B
4   C
5   D 
6   A
6   B

等等。换句话说,我有每个 ID 的数据组。您会注意到数据组 (A, B) 出现多次。我想要一个可以识别不同数据组并对它们进行编号的查询,例如:

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

所以 DataID 102 类似于数据 (A,B),DataID 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'
4

4 回答 4

3

在我看来,您必须创建一个连接数据的自定义聚合(如果出于性能原因,建议使用字符串 CLR 方法)。然后我会按 ID 分组并选择与分组不同的分组,添加 row_number() 函数或添加您选择的 dense_rank()。无论如何它应该看起来像这样

with groupings as (
select concat(data) groups
from Table1
group by ID
)
select groups, rownumber() over () from groupings
于 2010-11-25T10:29:31.910 回答
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 的上述建议将是更通用的方式,并且可能是更明智的方式来实施解决方案,尽管在您的情况下。

于 2010-11-25T11:04:16.850 回答
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 的解决方案。

于 2010-11-25T11:20:43.537 回答
0

从您的示例数据(添加了缺少的 2,'A' 元组,以下给出了重新编号(和唯一化)的数据:

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

我认为,将输出中的行与原始表中的行匹配是关系划分的问题。

于 2010-11-25T11:11:49.347 回答