Удаление дублирующихся строк на основе атрибута в SQL - PullRequest
0 голосов
/ 10 января 2019

Итак, я пользователь SAS, который сейчас использует SQL для моей новой работы.

В SAS мне удалось выполнить этот запрос для удаления дубликатов:

proc sort data = customer_data
nodupkey out = customer_data_no_dups;
by Cus_ID;
run;

Я хочу что-то, что даст мне тот же результат в SQL

enter image description here

Список слишком велик, чтобы сделать его в Excel

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Я думаю, что более точная эквивалентность в старых версиях MySQL:

select t.*
from t
where t.item = (select min(t2.item)
                from t t2
                where t2.cus_id = t.cus_id
               );

Это позволяет вам выбрать столько столбцов, сколько вам нужно, из строки с минимальным элементом.

Единственное отличие от вашего запроса состоит в том, что вы получите дублирующиеся строки, если клиенты могут иметь дублирующиеся элементы.

В MySQL 8+ вы также можете использовать row_number():

select t.*
from (select t.*,
             row_number() over (partition by cus_id order by item) as seqnum
      from t
     ) t
where seqnum = 1;
0 голосов
/ 10 января 2019

Если у вас есть ключи, которые повторяются, и спутниковые данные, которых нет (эти элементы #), строка, которая заканчивается в наборе результатов, будет произвольной. Proc SQL имеет удобную функцию для автоматического повторения сводной статистики, а недокументированная функция monotonic() может использоваться для дискретизации повторяющихся ключевых строк (включая полностью идентичные строки), которые затем могут быть использованы для использования в предложении having.

Этот пример кода создает некоторые данные с повторяющимися ключами, а также несколько идентичных строк.

data have;
  do _n_ = 1 to 1000;
    key1 = ceil (10 * ranuni(123));
    key2 = ceil (10 * ranuni(123));
    key3 = ceil (10 * ranuni(123));
    sat1 = 100 + ceil (4 * ranuni(123));
    sat2 = 100 + ceil (4 * ranuni(123));
    output;
  end;
run;

proc sql; 
  * result set for distinct rows -- some key repetition still present;
  create table distinct_all as
  select distinct * from have
  ;

  * result set for distinct keys -- fewer than distinct rows;
  create table keys as
  select distinct key1,key2,key3 from have
  ;

  * result for distinct keys with an arbitrary row amongst the repeateds;
  create table distinct_key_arb_sat(drop=seq) as
  select key1, key2, key3, sat1, sat2, monotonic() as seq
  from have
  group by key1, key2, key3
  having seq = min(seq)
  ;
0 голосов
/ 10 января 2019

Ваш желаемый результат подсказывает мне простое слияние:

select CUS_ID, First, Last, min(Item) 
from table t
group by CUS_ID, First, Last; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...