Как индексировать строки с повторяющимися значениями в столбце? - PullRequest
0 голосов
/ 10 октября 2018

Как подсчитать дубликаты в Phone?

Например:

State   Zip Areacode    Phone
A       123 1           989
b       234 2           989
c       345 3           989
d       456 4           123
e       567 5           123
f       678 6           234
g       678 7           234

Ожидаемый результат:

State   Zip Areacode    Phone   row_count
A       123 1           989     1
b       234 2           989     2
c       345 3           989     3
d       456 4           123     1
e       567 5           123     2
f       678 6           234     1
g       678 7           234     2

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Ниже приведен запрос MySQL для поиска дубликатов записей путем сравнения нескольких столбцов

SELECT 
    Zip, COUNT(Zip),
    Areacode,  COUNT(Areacode),
    Phone,      COUNT(Phone)
FROM
    TableName
GROUP BY 
    Zip , 
    Areacode , 
    Phone
HAVING  COUNT(Zip) > 1
    AND COUNT(Areacode) > 1
    AND COUNT(Phone) > 1;

Замените TableName на ваше имя таблицы Mysql.

Ссылка

0 голосов
/ 10 октября 2018

Это оконная функция проблема.Для более старых версий MySQL ( <8.0 </strong>) мы можем эмулировать его, используя переменные сеанса .Попробуйте следующее:

SELECT t1.State, 
       t1.Zip, 
       t1.Areacode, 
       @row_count := CASE 
                       WHEN @ph = t1.Phone Then @row_count + 1
                       ELSE 1 
                     END AS row_count, 
       @ph := t1.Phone AS Phone 
FROM 
  (SELECT State, 
          Zip, 
          Areacode, 
          Phone 
   FROM your_table 
   ORDER BY Phone) AS t1  
CROSS JOIN (SELECT @row_count := 1) AS init1 
CROSS JOIN (SELECT @ph := '') AS init2 

PS: У OP подтверждено , что нумерация внутри раздела Phone может быть любой.

0 голосов
/ 10 октября 2018

Простое решение, если вы заказываете по номеру телефона:

SELECT State, Zip, Areacode, Phone, `Index` FROM (
    SELECT State, 
           Zip, 
           Areacode, 
           Phone, 
           @Idx := IF(@previous_phone=Phone, IFNULL(@Idx,0)+1,1) as Index,
           @previous_phone := Phone
    FROM table 
    ORDER BY Phone
) t;

Это просто отслеживает предыдущий номер телефона и сбрасывает индекс, если он изменяется.

Если вы хотите сосчитать дубликаты для комбинации Zip Area Phone, то вы можете сравнить на основе CONCAT(Zip,Area,Phone) например

SELECT State, Zip, Areacode, Phone, `Index` FROM (
    SELECT State, 
           Zip, 
           Areacode, 
           Phone, 
           @Idx := IF(@previous_phone=CONCAT(Zip, Area, Phone), IFNULL(@Idx,0)+1,1) as Index, 
           @previous_phone := CONCAT(Zip, Area, Phone)
    FROM table 
    ORDER BY Zip, Area, Phone
) t;
...