#sql
#sql
Вопрос:
У меня есть 3 столбца в одной таблице в SQL, по одному для номера, имени и других несвязанных данных. Числа повторяются определенное количество раз и имеют имя рядом с ними, в одном и том же номере не может быть имени дважды, но имена могут присутствовать в нескольких разных числах. Мне нужно выполнить SQL-запрос, чтобы найти, какие имена были под одним и тем же номером наибольшее количество раз. Любая помощь будет очень признательна.
Пример: SQL-запрос найдет, какие имена были сгруппированы вместе больше всего.
1 Bill
1 Bob
1 Dave
2 Bob
2 John
2 Bill
Комментарии:
1. какая у вас СУБД?
2. Согласно вашему заявлению о проблеме: «не может быть имени дважды на одном и том же номере». Максимальное значение «Мне нужно выполнить SQL-запрос, чтобы найти, какие имена были под одним и тем же номером наибольшее количество раз, равно 1. Ваш вопрос неясен.
Ответ №1:
Для подтверждения — вы хотели бы найти
- Пары имен, которые встречаются вместе в «числе»
- Из них найдите пару, которая встречается чаще всего
Хитрость здесь в том, чтобы получить все пары, а затем подсчитать, сколько «чисел» появляется в этой паре.
Чтобы получить пары, присоедините таблицу к самой себе (по номеру), а затем, чтобы в каждой было только одно сопряжение, также объедините по имени с первым в паре < вторым в паре.
Ответ на этот вопрос зависит от вашей базы данных (SQL Server, MySQL и т. Д.). Однако вот пример, написанный на T-SQL, но он довольно общий, который выполняет большую часть работы: он показывает количество и упорядочивает их по соответствующему количеству.
- Не стесняйтесь получить ВЕРХ или ПРЕДЕЛ 1, чтобы получить пару с наибольшим количеством совпадений (отметив, что если есть ничья, таким образом будет выбран только один)
- В качестве альтернативы измените запрос, чтобы определить максимальное число, а затем получите пары с этим числом.
CREATE TABLE NameGrps (NameNum int, Name varchar(30));
INSERT INTO NameGrps (NameNum, Name)
VALUES
(1, 'Bill'),
(1, 'Bob'),
(1, 'Dave'),
(2, 'Bob'),
(2, 'John'),
(2, 'Bill');
SELECT NamePairs.FirstInPair, NamePairs.SecondInPair, COUNT(NameNum) AS Num_Paired
FROM
(SELECT A.Name AS FirstInPair, B.Name AS SecondInPair, A.NameNum
FROM NameGrps A
INNER JOIN NameGrps B ON A.NameNum = B.NameNum AND A.Name < B.Name
) AS NamePairs
GROUP BY NamePairs.FirstInPair, NamePairs.SecondInPair
ORDER BY COUNT(NameNum) DESC, NamePairs.FirstInPair, NamePairs.SecondInPair;
И вот результаты приведенного выше
FirstInPair SecondInPair Num_Paired
Bill Bob 2
Bill Dave 1
Bill John 1
Bob Dave 1
Bob John 1
Если вы возьмете ВЕРХ или ОГРАНИЧИТЕ 1 из этого, он обнаружит, что пара Билла и Боба является наиболее частой.
Вот db<>fiddle с запросом, а также дополнительная информация (например, что делает вложенный запрос и добавление версии TOP 1).