2014-01-29 5 views
0

Я пытаюсь запустить собственный SQL-запрос, чтобы выбрать только дубликаты строк в наборе данных, за исключением уникальных результатов.Как удалить уникальные строки и дубликаты KEEP? SQL

Я пытаюсь отобразить только дублированные строки для каждого проекта, т. Е. Если для проекта (автомобиль) пользователь дважды добавил продукт (окно). Хотя окно может содержаться во многих других проектах (дом, здание и т. Д.), Условие - это дублирование внутри проекта, а не весь набор данных.

можно ли написать запрос для этого?

UPDATE: duplicates

Как вы можете видеть на изображении ниже, проекты (ID) 500 и 505 содержат повторяющиеся части в них (окна и капот), так что я хотел бы показать это только результаты проектов (ids), содержащих дубликаты. Таким образом, окончательный вид не будет иметь проектов 501, 502, 503, 504, 506. И дублирующиеся будут отображать только строки, содержащие дублируемое поле, т.е. проект 500 (id) будет отображать только строки 100 (область) и 108 и удалять 101, 102 и 114, которые являются уникальными. Как показано ниже, часть OC01 (выделена красным цветом) также может отображаться на других проектах (id), но проект 503 не должен отображаться, поскольку OC01 не дублируется внутри этого идентификатора.

Данные содержатся в файле excel, который затем обрабатывается программным обеспечением BI, называемым Tableau, которое позволяет мне писать пользовательский sql для извлечения данных из xls разными способами.

+1

Какая СУБД вы используете? Postgres? Oracle? –

+0

Отправьте свою точную схему таблиц. Стол, о котором вы говорите, является таблицей многих ко многим ('project_product')? Если это так, то у меня есть уникальный столбец идентификатора (Project) *, который не имеет большого смысла. – peterm

+0

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

ответ

2

Вы можете сделать это легко с оконными/аналитических функций:

select t.* 
from (select t.*, count(*) over (partition by project, product) as cnt 
     from table t 
    ) t 
where cnt > 1; 

Эти функции поддерживаются в большинстве баз данных. Если они недоступны, вы можете выполнить логику либо с помощью коррелированного подзапроса, либо путем соединения в запросе group by.

EDIT:

Я не знаю, если Tableau поддерживает выше запрос. Вы можете попробовать это:

select t.* 
from table t1 
where 1 < (select count(*) 
      from table t2 
      where t2.project = t.project and t2.product = t.product 
     ); 

Возможно, эта версия будет работать:

select t.* 
from table t join 
    (select project, product, count(*) as cnt 
     from table t 
     group by project, product 
    ) pp 
    on t.project = pp.project and t.product = pp.product and cnt > 1; 
+0

linoff, спасибо за ваш ответ, я редактировал вопрос выше с изображением, чтобы лучше объяснить мою цель. любая помощь будет принята с благодарностью. – rafacardosoc

+0

@rafacardosoc. , , Я считаю, что этот запрос делает то, что вы хотите. –

+0

когда я выполнить запрос, как вы уже упоминалось выше (см ниже) SELECT, т. * из [Лист1 $] t1 где 1 <(выберите отсчет (*) из [Лист1 $] t2 где t2. [ id] = t. [id] и t2. [part] = t. [part] Я получаю следующее сообщение об ошибке: Ошибка базы данных Microsoft JET 0x80040E14: Синтаксическая ошибка в предложении FROM – rafacardosoc

1
SELECT * FROM TABLE1 
WHERE project 
IN (SELECT X.project FROM (
    SELECT project, product,COUNT(product) 
    FROM TABLE1 
    GROUP BY project,product 
    HAVING COUNT(product) > 1)X) 
AND product IN (SELECT X.product FROM (
    SELECT project, product,COUNT(product) 
    FROM TABLE1 
    GROUP BY project,product 
    HAVING COUNT(product) > 1)X) 
+0

Нет необходимости в производной таблице (встроенный просмотр) в вашем примере, и он не предоставляет все столбцы из базовой таблицы для строк, которые являются дубликатами. – peterm

+0

stat_novice, спасибо за ваш ответ, я редактировал вопрос выше с изображением, чтобы лучше объяснить мою цель. очень понравилось. – rafacardosoc

+0

В моем примере, если вы замените проект своим полем «ID» и продуктом с полем «part», который должен *** работать ***. Я предпочитаю ответ dnoeth, хотя он проще. –

1

Если СУБД не поддерживает функции Оконных Агрегатных используемых решениями Гордона Линофф в вы можете сделать:

select t1.* 
from table t1 
join 
    (select project, product 
    from table 
    group by project, product 
    having count(*) > 1 
) t2 
on t1.project = t2.project 
and t1.product = t2.Product; 

Редактировать, основываясь на обновленном запросе:

SELECT * 
FROM tab t1 
WHERE EXISTS 
(
    SELECT * FROM tab t2 
    WHERE t1.id = t2.id 
    AND t1.part = t2.part 
    AND t1.scope <> t2.scope 
); 
+0

dnoeth, спасибо за ваш ответ, я отредактировал вопрос выше с изображением, чтобы лучше объяснить мою цель. любая помощь будет принята с благодарностью. – rafacardosoc

+0

он отлично работал на этот раз. Большое спасибо. запрос занимает много времени, но на данный момент это замечательно. Спасибо!! – rafacardosoc

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