2012-03-30 25 views
0

我遇到了分組數據的問題。我一直使用group by子句,但這次我想將類似的有價值的數據組合在一起。 需求是我有一些作業有序號相關聯。如果我可以將具有或多或少相同序列號的作業分組在一起,那麼我可以運行較少數量的作業。SQL將類似的值分組在一起

我擁有的數據就是這樣。

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上述數據有更多的共同之處。

應做什麼查詢到一起得到類似的數據組爲以下組A02和A04一起,A01和A03一起,在順序列的順序是無關緊要的。

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 

感謝您的時間

大衛

PS - 更多的解釋。

在上述列表中的JobID A01包含序列(8,6,10) A02包含序列(5,10,4,2) A03包含序列(8,3,6,10) A04包含序列(5,4,2,9,10)

所以工作A01和A03作業具有相似的序列號和工作A02和A03作業具有相似的序列號。我想根據相似的序列號對它們進行分組 還有許多其他的作業有序列可能與其他作業的序列號相匹配。我只包括了4份工作,以保持名單不變。

+0

你嘗試過寫SQL查詢,以及它的工作原理? – cctan 2012-03-30 08:48:29

+0

是的,我做了沒有給我預期的輸出,雖然「選擇jobid,從序列jobid組序列,jobid」 – 2012-03-30 08:50:23

+0

你只是想通過'JobID'按順序A01,A03,A02,A04 ? 是那些唯一的JobIDs - 還是有更多.. A05 .. B01 .. Z99? – Paddy 2012-03-30 08:54:00

回答

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

他想確定那個順序。在查詢之前他不知道它。 – 2012-03-30 09:17:30

+0

@FlorinGhita - 我已經編輯我的回答基於BrandonMoores回答 – Paddy 2012-03-30 09:37:29

+0

以上好吧,現在它是一個有效的嘗試:)並從我+1 +1 – 2012-03-30 09:39:18

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#(或您選擇的語言)這樣的真正編程語言來解決這個問題,除非您只是喜歡一個好的腦筋急轉彎。 – 2012-03-30 09:31:43

+0

我的第一選擇是C#,但它太慢了,所以我只想看看它是否可以在db中完成。 – 2012-03-30 10:25:38

+0

@davidmichell有多少條記錄?我會在一個星期左右的時間裏保持這種想法,並且會在這個時候有一個燈泡的時刻。會讓你知道,如果/當發生這種情況:) – 2012-03-31 06:35:51

2

只是從其他答案推斷...可能有所幫助。

在這裏,你必須每兩個jobids如何simmilar是:

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 – 2012-03-30 15:50:59

+0

+ 1爲一個更簡單的SQL邏輯 – cctan 2012-04-02 01:18:50