SQL группирует похожие значения вместе - PullRequest
0 голосов
/ 30 марта 2012

У меня проблема с группировкой данных. Я использовал предложение group by все время, но на этот раз я хочу сгруппировать похожие ценные данные вместе. Нужно, чтобы у меня были задания, связанные с порядковыми номерами. Если я смогу сгруппировать задания, имеющие более или менее одинаковые порядковые номера, я смогу запустить меньшее количество заданий.

Данные, которые у меня есть, такие.

    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 задания, чтобы сохранить небольшой список.

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Это немного более сложная проблема, чем сейчас, когда я думаю об этом, но я дам вам идею, с которой можно начать, и, возможно, кто-то другой может помочь вам решить ее ...

Присоединяй стол к себе вот так:

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

Я не проверял это, поэтому могут быть опечатки, но, надеюсь, вы поняли идею. Обратите внимание, что вы присоединяетесь, где задание не совпадает, но последовательность такова.

2 голосов
/ 30 марта 2012

Просто выводите из других ответов ... что-то, что может помочь.

Здесь у вас есть для каждых двух рабочих мест, как схожи:

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
;
1 голос
/ 30 марта 2012

Опираясь на Брэндона Мура, ответ:

Настройка данных:

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 

Найти общие суммы всех последовательностей, которые есть у каждого идентификатора JobID, упорядочить их в порядке убывания, вывести все данные из каждого 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)

Должен это сделать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...