我有以下表格:
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'
答案 0 :(得分: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
答案 1 :(得分: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,这将是坦率的,一个荒谬的查询肯定: - )
坦率地说,幸运卢克的上述建议将是更通用的方式,并且可能是在你的情况下实施解决方案的更好的方式。答案 2 :(得分: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
我认为,这是关系划分的问题,将此输出中的行与原始表中的行进行匹配。
答案 3 :(得分: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的解决方案。