Как сделать все столбцы строк, где несколько столбцов появляются более одного раза - PullRequest
0 голосов
/ 11 июля 2019

у меня одна таблица Мне нужно вернуть все столбцы для строк, где 4 столбца наблюдаются более одного раза.

У меня есть большая таблица с данными, имеющими уникальный идентификатор, несколько столбцов, которые вместе могут повторяться, а затем либо 2018, либо 2019 год, как год, когда мы получили данные:

ID - Name - ZIP - Phone - Year Recorded 
4234 | John | 56473 | 555-555-555 | 2018
4234 | Tod  | 73746 | 556-556-556 | 2018
4235 | John | 56473 | 555-555-555 | 2019
4236 | Mary | 47384 | 577-577-577 | 2019

Я хочу выбрать * из [таблицы], где Имя, ZIP, Телефон повторяются, а год - 2019:

4235 | John | 56473 | 555-555-555 | 2019

Я использовал следующее, чтобы хотя бы показать пару столбцов для всех строк, для которых эти столбцы одинаковы:

SELECT `Name`, `ZIP`, `Phone`, COUNT(*)
FROM VULNS
GROUP BY `Name`, `ZIP`, `Phone`
HAVING COUNT(*) > 1

John | 56473 | 555-555-555 | 2

Проблема в том, что мне нужно указать ID и год записи, но я не могу их включить, потому что их нет в GROUP BY. Если я включу эти столбцы в GROUP BY, то все будет уникальным и я не получу результатов.

Прошло много времени с тех пор, как я интенсивно использовал SQL, и я думаю, что подхожу к этому неправильно.

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Я бы использовал exists:

SELECT v.*
FROM VULNS as v
WHERE v.YearRecord = 2019 AND
      EXISTS (SELECT 1
              FROM VULNS as v2
              WHERE v2.Name = v.Name AND
                    v2.ZIP = v.ZIP AND
                    v2.Phone = v.Phone AND
                    v2.YearRecorded <> v.YearRecorded 
             );

То есть просто верните строки из 2019, где столбцы совпадают в другом году.

0 голосов
/ 11 июля 2019

Включите ID в список GROUP BY с подзапросом и используйте ( Name, ZIP, Phone, YearRecorded) для сопоставления с подзапросом, где следует учитывать MAX(YearRecorded):

SELECT `ID`, `Name`, `ZIP`, `Phone`, `YearRecorded`
  FROM VULNS
 WHERE (`Name`, `ZIP`, `Phone`, `YearRecorded`) in 
(
 SELECT `Name`, `ZIP`, `Phone`, MAX(`YearRecorded`)
   FROM VULNS v
  GROUP BY `ID`, `Name`, `ZIP`, `Phone`
 HAVING COUNT(*) > 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...