Intereting Posts
оракул, как транспонировать столбцы в строки без UNION Синтаксическая ошибка при создании числового столбца Преобразование инструкции SQL в LINQ-To-SQL MySQL: как программно определить отношения внешнего ключа? Динамическая переменная переменная SQL Server неправильно из курсора Преобразовать unsigned int в подписанный int через google BigQuery Выберите максимальное значение для каждой группы Oracle SQL. Как получить отдельные строки с использованием RANK () или DENSE_RANK () или ROW_NUMBER () аналитической функции? Ограничить результаты запроса двумя строками на группу Отрицательные первичные ключи Что такое эффективный способ вставки тысяч записей в таблицу SQLite с помощью Django? Поиск подстановочных знаков для LINQ Как можно оценивать несколько раз данные из запроса? Как обновить один столбец, используя другой столбец в другой таблице? Ошибка SQL: ORA-00933: команда SQL неправильно завершена как группировать и подсчитывать с помощью MySQL

SQL группирует одинаковые значения вместе

У меня возникла проблема с группировкой данных. Я все время использовал предложение 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 и Job A03 имеют одинаковые порядковые номера, а Job A02 и Job A03 имеют одинаковые порядковые номера. Я хочу сгруппировать их на основе похожих порядковых номеров. Есть много других заданий, которые имеют последовательности, которые могут соответствовать некоторым порядковым номерам других заданий. Я просто включил 4 задания, чтобы сохранить список небольшим.

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

Присоединитесь к таблице так:

 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 

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

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

Здесь у вас есть для каждых двух заданий, как 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 ; 

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

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

 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 в зависимости от этого порядка:

 ;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) 

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