2016-10-14 1 views
0

У меня есть таблица PostgreSQL, которая хранит пользовательские данные, называемые пользователей, как показано нижеPostgres: Удаление строк, которые дублируются в одном столбце на основании условий другого столбца

ID | user name  | item | dos  | Charge| 
1 |  Ed   | 32 |01-02-1987| 1  | 
2 |   Taya |  01 |05-07-1981|-1  | 
3 |   Damian |  32 |22-19-1990| 1  | 
2 |   Taya |  01 |05-07-1981| 1  | 
2 |   Taya |  01 |05-07-1981| 1  | 
1 |    Ed |  32 |01-02-1987|-1  | 

Я хочу, чтобы удалить строки, где они же через id, username, item и dos & сумма расходов равна 0. Это означает, что и строка 1, и строка 6 для ed будут удалены.

С более чем 2 случаями, если сумма заряда равна 1, я хочу, чтобы одна из строк с зарядом -1 и 1 удалялась, что означает, что одна строка с зарядом 1 будет сохранена. Например, ROw 2 и Row для Taya будут удалены.

Выходной стол, который я после того, как есть:

ID | user name  | item | dos  | Charge| 
3 |   Damian |  32 |22-19-1990| 1  | 
2 |   Taya |  01 |05-07-1981| 1  | 

Любые идеи?

ответ

2

Вы хотите having пункт:

Это поможет вам выход вы хотите:

select 
    id, user_name, item, dos, sum (charge) 
from table 
group by 
    id, user_name, item, dos 
having 
    sum (charge) != 0 

Если вы действительно пытаетесь удалить записи, которые делают его нулю:

delete from table 
where (id, user_name, item, dos) in (
    select id, user_name, item, dos 
    from table 
    group by id, user_name, item, dos 
    having sum (charge) = 0 
) 

Это делает то же самое, и это довольно немного больше кода, но поскольку он использует полу-соединение, это может быть лучше для действительно больших наборов данных:

with delete_me as (
    select id, user_name, item, dos 
    from table 
    group by id, user_name, item, dos 
    having sum (charge) = 0 
) 
delete from table t 
where exists (
    select null 
    from delete_me d 
    where 
    t.id = d.id and 
    t.user_name = d.user_name and 
    t.item = d.item and 
    t.dos = d.dos 
) 
+0

@ hamone ... Спасибо, сработало: - – Geethurv

+0

@Geethurv - Я рад, что все получилось. В соответствии с протоколом, если решение соответствует вашим потребностям, обязательно отметьте его как принятое. Таким образом, если у будущих людей будет аналогичная проблема, они будут знать, что у нее есть работоспособное решение – Hambone

Смежные вопросы