1 Востаннє редагувалося Betterthanyou (24.06.2021 15:06:37)

Тема: Знайти дублі рядки за спеціальною умовою

Є таблиця
Table1
id INT
telephone VARCHAR(25)

Номери мобільних телефонів записуються в поле telephone у довільному форматі.

потрібно знайти всі дублі телефонів, але за спеціальних умов

1) Номер мобільного телефону отримати з 9 знаків з кінця рядку.
Наприклад:
"+380668958742", "0668958742", "380668958742" - дублі
"+380667851246", "80667851246" - дублі

Тобто:
"+380667851246" - з кінця 9 знаків буде "667851246".

2) Дублів може бути тільки два, якщо їх більше, то пропускати
"+380668958742", "0668958742", "380668958742" - пропустити
"+380667851246", "80667851246" - вивести

Дублі вивести в тимчасову таблицю, tempTable1.
tempTable1
id INT
telephone VARCHAR(25)
id_first - тут ІД з Table1 першого номеру дублікату
id_second - а тут ІД з Table1 другого номеру дублікату

Підкажіть як можна створити такий запит чи збережену процедуру ?

Я працюю з Informix, але й можна на інших СУБД... я спробую зрозуміти і переробити під інформівський SQL.

Подякували: 0xDADA11C71

2 Востаннє редагувалося frz (24.06.2021 15:50:06)

Re: Знайти дублі рядки за спеціальною умовою

тестовано на Postgresql
with data as (
    select '+380668958742' as phone union all 
    select '0668958742' as phone union all 
    select '380668958742' as phone union all 
    select '+380667851246' as phone union all 
    select '80667851246' as phone
),
tsql as (
    select RIGHT(phone, 10) as phone_last from data
)
select phone_last 
from tsql
group by phone_last
having count(1) = 2;

phone_last
0667851246

Далі, сподіваюся, закінчите самостійно.

3

Re: Знайти дублі рядки за спеціальною умовою

MySQL
Нашвидкуруч (однозначно можна оптимізувати):

INSERT INTO tempTable1 ( telephone, id_first, id_second ) SELECT DISTINCT RIGHT
( telephone, 9 ) AS telephone,
(
    SELECT
        Table1.id 
    FROM
        Table1 
    WHERE
        RIGHT ( telephone, 9 ) = RIGHT ( tmp.telephone, 9 ) 
    ORDER BY
        id ASC 
        LIMIT 1 
    ),
    (
    SELECT
        Table1.id 
    FROM
        Table1 
    WHERE
        RIGHT ( telephone, 9 ) = RIGHT ( tmp.telephone, 9 ) 
    ORDER BY
        id DESC 
        LIMIT 1 
    ) 
FROM
    Table1 AS tmp 
WHERE
    RIGHT ( telephone, 9 ) IN (
    SELECT
        telephone 
    FROM
        ( SELECT id, RIGHT ( telephone, 9 ) AS telephone FROM Table1 ) AS temp 
    GROUP BY
        telephone 
    HAVING
    count(*) = 2 
    )
Подякували: Betterthanyou, 0xDADA11C72