2017-02-10 3 views
0

, пожалуйста, простите меня, если мой жаргон выключен. Я все еще учусь!поиск повторяющихся строк с разными идентификаторами на основе нескольких столбцов

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

Я успешно выбрал таблицу из базы данных, которая выглядит как:

ID  service  date name 

1  service1 1/5/15 john  
2  service2 1/7/15 steve 
3  service3 1/8/15 lola 
4  service4 1/3/15 joan 
5  service5 1/5/15 fred   
6  service3 1/3/15 joan 
7  service5 1/8/15 oscar 

Теперь я хочу, чтобы найти базу данных еще раз, чтобы найти повторяющиеся идентификаторы (например, чтобы увидеть, если сервис service1 с датой 1/5/15 с именем john существует в другом ряду с другим идентификатором.)

Сначала я сделал что-то вроде этого:

SELECT ID, service, date, name 
FROM table 
WHERE table.service = ANY(service1, service2, service3, service4, service5, service3, service5) 
AND table.date = ANY('1/5/15', '1/7/15, '1/8/15', '1/3/15', '1/5/15', '1/3/15', '1/8/15') 
AND table.name = ANY('john', 'steve', 'lola', 'joan', 'fred', 'joan', 'oscar'); 

Но это дает мне больше строк, чем я хотел.

пример:

ID  service  date  name 
92  service3 1/8/15 steve 

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

что-то подобное было бы выгодно:

ID  service  date  name 
609  service3 1/8/15 lola 

, поскольку она совпадает с чем ID 3.

мне было интересно посмотреть, если бы можно было рассматривать три колонки (службы, дата, имя) как вектор и, возможно, выбрать строки, которые соответствуют ему таким образом?

экс

...... 
WHERE (table.service, table.date, table.name) = ANY((service3,1/8/15,lola), (service1, 1/5/15, john), ...etc) 

Мой Teradata вниз прямо сейчас, поэтому я до сих пор не попробовать в приведенном выше примере. Тем не менее, любые мысли/отзывы очень приветствуются!

+0

Откуда стоит идентификатор '609' в вашем ожидаемом выходе? –

+0

Приведенная выше таблица не является моей фактической таблицей; это было сделано так, чтобы я не выдавал никакой конфиденциальной информации. Но в любом случае эти дубликаты, которые я ищу, представляют собой небольшое подмножество очень большого количества строк; Я не знаю, сколько строк, я просто знаю, что я не мог загрузить их. – Sam

+0

Я дал вам ответ ниже, попробуй, и если он не сработает, оставьте комментарий. –

ответ

0

Следующий запрос может быть тем, чего вы пытаетесь достичь. Это выбирает идентификаторы, для которых комбинация service, date и name отображается более одного раза.

SELECT t1.ID 
FROM yourTable t1 
INNER JOIN 
(
    SELECT service, date, name 
    FROM yourTable 
    GROUP BY service, date, name 
    HAVING COUNT(*) > 1 
) t2 
    ON t1.service = t2.service AND 
     t1.date = t2.date AND 
     t1.name = t2.name 
+0

Я думаю, что сделал трюк; спасибо вам помощь очень ценю! – Sam

0

Не указывайте значения жесткого кода в запросе, если это вам не обязательно. Вместо этого возьмите запрос, который вы уже написали, и присоединитесь к нему.

SELECT dupes.* 
FROM (your query) yourquery 
JOIN table dupes 
    ON yourquery.service = dupes.service 
AND yourquery.date = dupes.date 
AND yourquery.name = dupes.name 
1

Это простая задача для оконного агрегата:

SELECT * 
FROM tab 
QUALIFY 
    COUNT(*) OVER (PARTITION BY service, date, name) > 1 

Это подсчитывает количество строк с одной и той же комбинации значений (например, производной таблицы Tim Biegeleisen), но в отличие от стандартного агрегата он держит все строки. QUALIFY является хорошим расширением синтаксиса Teradata, чтобы избежать производной таблицы.

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