如果在同一日期发生,请选择列

时间:2013-06-03 19:03:34

标签: sql date unique

我正在尝试创建一个将选择多个列(uniqueID,IPaddress,date,country)的查询,但我希望查询仅选择那些在给定日期显示相同IPaddress和UniqueID的记录。我一直在努力......

SELECT uniqueID AS uniqueID, 
IPAddress AS IPAddr,
Date AS DDate, 
Location AS Countries,
COUNT(IPAddress) AS IPCount
FROM History WHERE (uniqueID= 20677) 
GROUP BY Date
ORDER BY DDate DESC, IPAddr DESC 

但它确实消除了一天只出现一个Ip / UniqueID的记录。我真的只想找到 uniqueID在同一天出现在不同IP地址的记录。

2 个答案:

答案 0 :(得分:0)

不确定我是否完全遵循,但听起来你想要加入子查询:

SELECT a.*
FROM History a
JOIN (  SELECT uniqueID, Date, COUNT(DISTINCT IPAddress)
        FROM History 
        GROUP BY uniqueID,Date
        HAVING COUNT(DISTINCT IPAddress) > 1
     )b
ON a.uniqueID = b.uniqueID
AND a.date = b.date

编辑:误读你的不同IP地址部分,更新。

子查询将显示具有相同唯一ID /日期的多个IP地址的所有记录,然后将其连接到历史记录表,显示您所追踪的记录的所有字段。

答案 1 :(得分:0)

如果您正在寻找其中的重复项,则需要按三个字段进行分组:

SELECT uniqueID, IPAddress, "Date" AS DDate, Location AS Countries,
       COUNT(IPAddress) AS IPCount
FROM History
WHERE uniqueID = 20677
GROUP BY uniqueId, IPAddress, "Date"
having IPCount > 1;

您实际上并不需要uniqueid子句中的group by,因为您只选择了一个。但是,我认为它使查询的目的更加清晰。

如上所述,这将生成错误(因为location不在聚合子句中)或者返回location的随机值(如果您使用的是MySQL)。如果是后者,请尝试:

SELECT uniqueID, IPAddress, "Date" AS DDate,
       group_concat(Location) AS Countries,
       COUNT(IPAddress) AS IPCount
FROM History
WHERE uniqueID = 20677
GROUP BY uniqueId, IPAddress, "Date"
having IPCount > 1;

此外,在数据类型和函数之后命名列并不是一个好主意。在许多数据库中,date既是数据类型又是函数。其他一些名称,如DateAdded,可以避免这种冲突。