2012-03-30 6 views
0

私はグループのデータに問題が生じています。私はgroup by節を使用していましたが、今回は同様の価値のあるデータをグループ化したいと考えています。 シーケンス番号が関連付けられているジョブが必要です。同じシーケンス番号を持つジョブをまとめてグループ化できれば、より少ない数のジョブを実行できます。SQLグループ化と同様の値が一緒に

私が持っているデータは、このようなものです。 A02とA04は共通とA01とA03でより多くを持っていることがわかる上記のデータから、

JobID   Sequence 
    A01   8    
    A01   6 
    A01   10 
    A02   5 
    A02   10 
    A02   4 
    A02   2 
    A03   8 
    A03   3 
    A03   6 
    A03   10 
    A04   5 
    A04   4 
    A04   2 
    A04   9 
    A04   10 

は共通で多くを持っています。一緒にグループA02に以下と一緒にA04とA01とA03と一緒に類似したデータ群を取得するために行われる必要がありますどのようなクエリ

は、シーケンス列の順序は軽微であること。詳細説明 - 時間

デビッド

PS用

JobID   Sequence 
    A01   8    
    A01   6 
    A01   10 
    A03   8 
    A03   3 
    A03   6 
    A03   10 
    A02   5 
    A02   10 
    A02   4 
    A02   2 
    A04   5 
    A04   4 
    A04   2 
    A04   9 
    A04   10 

感謝。上記のリストに

はA01シーケンス(8,6,10) A02シーケンス(5,10,4,2) A03が含ま含ま含まJOBID配列(8,3,6,10) A04の配列を含みます(5,4,2,9,10)

だから、仕事A01とA03仕事は、同様のシーケンス番号を持っているし、仕事A02とA03仕事は、同様のシーケンス番号を持っています。私は彼らが同様のシーケンス番号に基づいてグループ化したい いくつかの他のジョブのシーケンス番号と一致する可能性がある配列を有する他の多くの仕事があります。私はちょうどリストを小さく保つために4つの仕事を含んだ。

+0

を使用すると、SQLクエリを書いて試してみましたが、それは動作しますか? – cctan

+0

はい、私はそれは私に "jobid、シーケンス、jobidによってjobtableグループからシーケンスを選択jobid"期待された出力を私に与えていない –

+0

あなたはA01、A03、A02、A04の順番で 'JobID'であなたのデータを注文したいですか? ? これらは唯一のJobIDですか?それ以上のものはありますか?A05 .. B01 .. Z99? – Paddy

答えて

1

ブランドンムーアの答えのビル:

データセットアップ:

DECLARE @Data TABLE (JobId nvarchar(10), Sequence int) 
INSERT INTO @Data(JobId, Sequence) 
SELECT 'A01',8 UNION ALL 
SELECT 'A01',6 UNION ALL 
SELECT 'A01',10 UNION ALL 
SELECT 'A02',5 UNION ALL 
SELECT 'A02',10 UNION ALL 
SELECT 'A02',4 UNION ALL 
SELECT 'A02',2 UNION ALL 
SELECT 'A03',8 UNION ALL 
SELECT 'A03',3 UNION ALL 
SELECT 'A03',6 UNION ALL 
SELECT 'A03',10 UNION ALL 
SELECT 'A04',5 UNION ALL 
SELECT 'A04',4 UNION ALL 
SELECT 'A04',2 UNION ALL 
SELECT 'A04',9 UNION ALL 
SELECT 'A04',10 UNION ALL 
SELECT 'A05',100 

は少なくともに最もによってそれらを注文し、各ジョブIDが共通に持っているすべてのシーケンスの合計を検索し、出力それぞれのJobIdからすべてのデータによって、そのために:

;WITH cte AS (
    SELECT A.JobID, A.Sequence, Count(*) AS [SequencesInCommon] 
    FROM @Data A 
    LEFT OUTER JOIN 
     @Data B on A.JobID <> B.JobID and A.Sequence = B.Sequence 
    GROUP BY A.JobID, A.Sequence 
),  
cte2 AS (
    SELECT JobID, SUM(SequencesInCommon) AS Total 
    FROM cte 
    GROUP BY JobID 
)  
SELECT d.JobId, d.Sequence 
FROM cte2 c 
INNER JOIN @Data d on c.jobID = d.JobID 
ORDER BY c.Total ASC, c.JobID ASC 

は与える:

JobId  Sequence 
---------- ----------- 
A05  100 
A01  8 
A01  6 
A01  10 
A03  8 
A03  3 
A03  6 
A03  10 
A02  5 
A02  10 
A02  4 
A02  2 
A04  5 
A04  4 
A04  2 
A04  9 
A04  10 

(17 row(s) affected) 

は、これは私が今を介してすべての道を考えてのように感じ、その後、問題のもう少し複雑です

+0

彼はその注文を決定したい。彼は質問の前にそれを知らない。 –

+0

@FlorinGhita - 私はBrandonMooresの答えに基づいて私の答えを編集しました – Paddy

+0

今、それは有効な試行:)と私から+1 –

2

:)それを行う必要がありますが、私はあなたを開始するためのアイデアを与えるだろう、多分他の誰かがすることができます

がそうのようなテーブルをそれ自体に参加...あなたがそれを完了するのに役立ちます。

Select A.JobID, A.Sequence, Count(*) 

from TheTable A join 
     TheTable B on A.JobID <> B.JobID and A.Sequence = B.Sequence 

group by A.JobID 

私はタイプミスがあるかもしれないことをテストしていませんが、あなたはうまくいけば、アイデアを得ます。ジョブが同じではない場所に参加していることに注意してください。ただし、シーケンスはです。ただ、...他の回答から助けるかもしれない何かを推測

+1

参考までに、純粋なSQLを使用していますが、理解しにくく、メンテナンス可能なコードではありません。私は非常に良い脳のおしゃべりを楽しまない限り、この問題を解決するためにC#(または選択した言語)のような実際のプログラミング言語を利用することを強くお勧めします。 –

+0

私の最初の選択はC#でしたが、遅すぎるので、dbで処理できるかどうかを確認したいだけです。 –

+0

@davidmichellレコード数は?私はこれを私の心の後ろにとどめ、1週間ほどかかります。それについて電球の瞬間があります。それが起こるかどうかを知ってくれます:) –

2

。ここで

あなた持っているかsimmilarがあるごとに2 jobids用:

http://sqlfiddle.com/#!3/c28be/9

Create table Data(Job nvarchar(10), seq int); 

insert into data 
SELECT 'A01' ,8 UNION ALL 
SELECT 'A01',6 UNION ALL 
SELECT 'A01',10 UNION ALL 
SELECT 'A02',5 UNION ALL 
SELECT 'A02',10 UNION ALL 
SELECT 'A02',4 UNION ALL 
SELECT 'A02',2 UNION ALL 
SELECT 'A03',8 UNION ALL 
SELECT 'A03',3 UNION ALL 
SELECT 'A03',6 UNION ALL 
SELECT 'A03',10 UNION ALL 
SELECT 'A04',5 UNION ALL 
SELECT 'A04',4 UNION ALL 
SELECT 'A04',2 UNION ALL 
SELECT 'A04',9 UNION ALL 
SELECT 'A04',10; 


select 
    d1.job as j1, 
    d2.job as j2, 
    count(*) cnt 
from Data d1 inner join Data d2 on (d1.seq = d2.seq and d1.job < d2.job) 
group by d1.job, d2.job 
; 
+0

これは重複(a02、a04)=(a04、a02)を削除します。ちょうど(a02、a04)で十分でしょう。このクエリもこれを行います。感謝Ghita –

+0

+1は、より簡単なSQLロジック – cctan

関連する問題