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

サンプルデータ(欠落している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 に答える
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 に答える