У меня есть контакты, у которых один и тот же номер телефона указан несколько раз. Я хотел бы удалить все эти записи, кроме одной. У меня есть доступ только для чтения к базе данных, поэтому мне придется создать файл csv для удаления записей через интерфейс программы.
в файле csv я хотел бы пронумеровать экземпляр дубликата
Что-то вроде этого:
Я знаю, как показать количество записей, но я очень надеюсь вместо этого получить экземпляр.
Это мой код:
SELECT DISTINCT
PS.PHONENUMBER.PHONENUMBER,
PA1.PERSONPHONENUMBERASSOCID,
PA1.PERSONID,
PA1.ISPREFERRED,
PA1.PHONENUMBERPRIORITYORDER
FROM
PS.PHONENUMBER
INNER JOIN PS.PERSONPHONENUMBERASSOC PA1 ON PA1.PHONENUMBERID = PS.PHONENUMBER.PHONENUMBERID
INNER JOIN PS.PERSONPHONENUMBERASSOC PA2 ON PA1.PERSONID = PA2.PERSONID AND PA1.PHONENUMBERID = PA2.PHONENUMBERID AND PA1.PERSONPHONENUMBERASSOCID <> PA2.PERSONPHONENUMBERASSOCID
ORDER BY
PA1.PERSONID,
PA1.PHONENUMBERPRIORITYORDER
Почему id
1631
получит экземпляр 2
, но id
1511
с меньшим номером получит экземпляр 3
? Какова ваша логика заказа, чтобы добраться до этого заказа экземпляра?
Я ввел идентификатор случайным образом — просто как пример уникального номера с тем же номером телефона.
Используйте ROW_NUMBER() в оконной функции.
ROW_NUMBER() с предложением ORDER BY, которое определяет правила упорядочивания в случае конфликта.
Пожалуйста, отредактируйте вопрос и включите минимальный воспроизводимый пример с: утверждениями CREATE TABLE
и INSERT
для ваших выборочных данных (и PS.PHONENUMBER.PHONENUMBERID
предполагает, что вам также может потребоваться включить утверждение CREATE TYPE
); объяснение на английском языке логики, которую вы хотите реализовать для упорядочивания чисел, и того, как перейти от запроса с 5 столбцами к 3 столбцам в CSV; и ожидаемый результат для этого образца данных. На данный момент ваш запрос мало связан с данными, поэтому вопрос довольно запутанный.
Это именно то, что мне было нужно. Большое спасибо!
-- S a m p l e D a t a :
Create Table PHONES AS
( Select 1131 "ID", 4515551111 "PHONE_NUMBER" From Dual Union All
Select 1154, 4400051133 From Dual Union All
Select 1214, 4400051133 From Dual Union All
Select 1243, 5555555555 From Dual Union All
Select 1511, 5555555555 From Dual Union All
Select 1631, 5555555555 From Dual Union All
Select 1965, 3333051133 From Dual
);
Используйте одну из аналитических функций, как показано ниже (их 3 с одинаковым результатом), чтобы получить экземпляры. Главное — разбить по PHONE_NUMBER и упорядочить экземпляры по желаемому порядку — я сделал это по идентификатору — может быть что угодно:
-- S Q L :
Select ID, PHONE_NUMBER,
ROW_NUMBER() OVER(Partition By PHONE_NUMBER Order By ID) "INSTANCE_ROW_NUMBER",
COUNT(ID) OVER(Partition By PHONE_NUMBER Order By ID) "INSTANCE_COUNT",
SUM(1) OVER(Partition By PHONE_NUMBER Order By ID Rows Between Unbounded Preceding And Current Row) "INSTANCE_SUM_1"
From PHONES
Order By ID
/* R e s u l t :
ID PHONE_NUMBER INSTANCE_ROW_NUMBER INSTANCE_COUNT INSTANCE_SUM_1
---- ------------ ------------------- -------------- --------------
1131 4515551111 1 1 1
1154 4400051133 1 1 1
1214 4400051133 2 2 2
1243 5555555555 1 1 1
1511 5555555555 2 2 2
1631 5555555555 3 3 3
1965 3333051133 1 1 1 */
См. скрипку здесь.
Какую СУБД вы используете? Пожалуйста, отметьте его, так как ответы могут существенно различаться в зависимости от вкуса. Пожалуйста, также отформатируйте свой код, чтобы он был более удобочитаемым для потенциальных ответов и других будущих посетителей этого вопроса.