Sql 为数据组选择DISTINCT

Sql 为数据组选择DISTINCT,sql,tsql,sql-server-2008,distinct-values,Sql,Tsql,Sql Server 2008,Distinct Values,我有以下表格: 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

我有以下表格:

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'

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

with groupings as (
select concat(data) groups
from Table1
group by ID
)
select groups, rownumber() over () from groupings

下面的查询用例将为您提供如下所示的结果

从那时起,获取不同的数据组并进一步进行应该不是一个真正的问题

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的上述建议将是实施解决方案的更通用、可能更明智的方式,尽管在您的案例中。

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

给予:

1          A
2          A
2          B
3          C
4          D

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

只是为了分享我目前使用的肮脏解决方案:

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的解决方案。

@littlegreen-您的预期输出中第3行和第2行的基础是什么?我很难理解您的意思/要求。ID和数据ID是如何关联的(如果有的话)?您是否有可能重做示例,使表之间没有重复使用的值,除非它们引用相同的内容?因为ID 3有数据(A,B)在我的原始表中,该数据组合收到了数据ID 2。@JohnPickup:当然,我重新编号了数据ID。希望现在更清楚。组总是成对的吗?这正是我希望避免的…(concat)不幸的是,这可能就是解决方案。除了创建一些聚合(每个ID的摘要)之外,如何以其他方式显示不同的数据组并与其他人进行比较。为什么聚合解决方案对您来说不可行。字符串长吗,或者数据是某种位图oor文件?字符串很长。我给它们分配了一个整数ID,但将这些整数连接成一个字符串并为此目的对其进行区分对我来说似乎是一个丑陋的黑客行为。这可能是唯一的解决方案注意是的,但在实现之前我想在这里检查它。聚合不需要是一个“脏”字符串连接,它可以是一个函数,它具有将一个整数集合转换为唯一值(无论类型如何)的属性.它与无损压缩或哈希有关。没错。我不知道有这样的函数,但我可以试着找到它。
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 )