SQL группировка по нескольким полям получает первое вхождение - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть эта таблица (sales_lines):

id  sale_id  sale_seq_id   other_fields
----------------------------------------
1     1       1
2     1       2
3     2       1 
4     3       1
5     3       2

Но эта таблица может иметь дубликат sale_seq_id (да, это ошибка). Например:

id  sale_id  sale_seq_id   other_fields
----------------------------------------
1     1       1
2     1       2
3     1       2
4     2       1 
5     3       1
6     3       1
7     3       2

Строки 3 и 6 являются ошибками, поэтому я должен их отменить.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Для удаления неправильных записей выполните

delete from sales_lines
where id not in 
(
  select min(id)
  from sales_lines
  group by sale_id, sale_seq_id
)

Чтобы просто удалить правильные данные, выполните

select min(id), sale_id, sale_seq_id
from sales_lines
group by sale_id, sale_seq_id
0 голосов
/ 20 апреля 2020

Я бы использовал коррелированный подзапрос:

select sl.*
from sales_line sl
where sl.id = (select min(sl1.id) 
               from sales_line sl1 
               where sl1.sale_id = sl.sale_id and 
                     sl1.sale_seq_id = sl.sale_seq_id
              );

Если ваша СУБД поддерживает оконную функцию, вы можете сделать:

select sl.*
from (select sl.*, 
             row_number() over (partition by sl.sale_id, sl.sale_seq_id order by sl.id) as seq
      from sales_line sl
) sl
where seq = 1;

Таким образом, вы получите полную строку с другие поля тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...