SQL 查询,GROUP/COUNT INNER JOIN 问题
SQL Query, GROUP/COUNT issue with INNER JOIN
我有一个主要由日期、ID 和地址组成的数据集,看起来有点像这样:
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
我的目标是编写一个查询,以识别与特定日期(或日期范围)的多个不同地址关联的任何 ID。我希望查询结果给我姓名和不同的地址。因此,对于此数据集,我希望看到的结果如下所示,日期为 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];
有什么建议吗?
编辑
我刚刚又看了一遍你的问题,你似乎想要所有重复的问题。在这种情况下,我会使用 exists
来查看是否存在具有相同 ID 但不同地址的另一行。
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
)
只需稍微修改您现有的查询,您就可以更改为 count(distinct address)
,然后重新加入 table 以获得您的地址值,如下所示:
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
上也应该类似。
我有一个主要由日期、ID 和地址组成的数据集,看起来有点像这样:
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
我的目标是编写一个查询,以识别与特定日期(或日期范围)的多个不同地址关联的任何 ID。我希望查询结果给我姓名和不同的地址。因此,对于此数据集,我希望看到的结果如下所示,日期为 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];
有什么建议吗?
编辑
我刚刚又看了一遍你的问题,你似乎想要所有重复的问题。在这种情况下,我会使用 exists
来查看是否存在具有相同 ID 但不同地址的另一行。
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
)
只需稍微修改您现有的查询,您就可以更改为 count(distinct address)
,然后重新加入 table 以获得您的地址值,如下所示:
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
上也应该类似。