Сравнение столбцов SQL

#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).