2015-08-17 2 views
1

У меня есть набор данных, состоящий в основном из дат, идентификаторов и адресов, который выглядит немного как это:SQL Query, GROUP/COUNT проблема с INNER JOIN

datadate id  address 
20150801 Bob  123 
20150801 Bob  123 
20150801 Dan  345 
20150801 Dan  456 
20150801 Dan  567 
20150801 George 234 
20150801 Jim  123 
20150801 Jim  123 
20150801 John 678 
20150801 John 123 
20150802 Tom  123 
20150802 Tom  234 
20150802 Tom  345 

Моя цель состоит в том, чтобы написать запрос, который идентифицирует любые идентификаторы, которые связаны с несколькими разными адресами на определенную дату (или диапазон дат). Я хочу, чтобы результаты запроса отображали мне имя и разные адреса. Таким образом, для этого набора данных, результаты, которые я хотел бы видеть, будет выглядеть следующим образом, на сегодняшний день 8/1/2015:

datadate id  address 
20150801 Dan  345 
20150801 Dan  456 
20150801 Dan  567 
20150801 John 678 
20150801 John 123 

Запрос я работал до сих пор, но это не действительно работает для меня:

SELECT a.[datadate], a.[id], a.[address], b.[count1] 
FROM table1 AS a INNER JOIN (SELECT [id], COUNT([address]) as [count1] FROM table1 GROUP BY [id] having count1 > 1 ) AS b ON a.[id]=b.[id] 
WHERE a.[datadate] = '20150801' 
ORDER BY a.[id], a.[address]; 

Любые предложения?

ответ

1

Просто модифицируя существующий запрос немного, вы можете изменить ваш иметь в count(distinct address), а затем присоединиться к столу, чтобы получить свои значения адреса, как это:

SELECT t.datadate 
     ,t.id 
     ,t1.address 
FROM (
    SELECT datadate 
     ,id 
     ,count(DISTINCT address) address 
    FROM test 
    WHERE datadate = '20150801' 
    GROUP BY datadate,id 
    HAVING count(DISTINCT address) > 1 
    ) t 
INNER JOIN test t1 ON t.datadate = t1.datadate 
    AND t.id = t1.id; 

Я испытал это на SQL Server , но должен быть аналогичным в MS-Access.

SQL Fiddle Demo

+0

Я только что проверил этот вариант, и он очень хорошо работает для меня. Он не работал в «MS-Access» (из-за оператора DISTINCT), но он отлично работал в «Impala» (где и находится моя большая таблица данных). Благодаря! – nxl4

+0

@ Psychonaut418 Удивительный! Да, я думаю, что синтаксис немного отличается для MS-Acess. – FutbolFan

0

Редактировать

Я только что прочитал ваш вопрос еще раз и, кажется, вы хотите, чтобы все дубликаты. В этом случае я бы использовал exists, чтобы увидеть, существует ли другая строка с тем же идентификатором, но с другим адресом.

select * from mytable t1 
where datadate = '20150801' 
and exists (
    select 1 from mytable t2 
    where t2.id = t1.id 
    and t2.address <> t1.address 
    and t2.datadate = t1.datadate 
) 
+1

Я предпочитаю ', где мин (адрес) <> макс (адрес)' по соображениям производительности и тот факт, что в MS Access не поддерживает 'количества (различных)'. –

+1

Проблема с группировкой по идентификатору заключается в том, что этот запрос не отображает разные записи в поле адреса. – nxl4

+0

@ Psychonaut418 см. Обновление – FuzzyTree