我有一个包含如下数据的表:
IP ACCESS_DATE
----------------------------
192.168.1.5 06/22/2018
192.168.1.5 06/20/2018
192.168.1.5 06/18/2018
192.168.1.7 06/22/2018
192.168.1.7 05/01/2018
192.168.1.212 06/22/2018
10.10.10.1 06/22/2018
这是SQL Server,所以不能使用inet ...
我的IP
列被定义为varchar(20)
。
我有一个查询,它列出了与该表中所有IP地址相关联的最近日期,我相信它工作得很好。但是,我似乎不能让它返回特定IP的结果。
这是一个有效的查询:
SELECT
t.IP, t.ACCESSS_DATE
FROM
(SELECT
IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
FROM
USER_ACCESS_HISTORY
GROUP BY
IP) x
JOIN
USER_ACCESS_HISTORY t ON x.IP = t.ip
AND x.ACCESSS_DATE = t.ACCESSS_DATE
但如果我这样做:
SELECT
t.IP, t.ACCESSS_DATE
FROM
(SELECT
IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
FROM
USER_ACCESS_HISTORY
GROUP BY IP) x
JOIN
USER_ACCESS_HISTORY t ON x.IP = '192.168.1.5'
AND x.ACCESSS_DATE = t.ACCESSS_DATE
它返回
192.168.1.5 06/22/2018
192.168.1.7 06/22/2018
192.168.1.212 06/22/2018
任何帮助都将不胜感激!
发布于 2018-07-25 06:13:09
更改此设置:
ON x.IP =t.ip
要这样做:
ON x.IP ='192.168.1.5'
断开查询中USER_ACCESS_HISTORY
表和子查询之间的关系,因此不再关联任何内容。你想要这个:
SELECT t.IP, t.ACCESSS_DATE
FROM(
SELECT IP,MAX(ACCESSS_DATE) AS ACCESSS_DATE
FROM USER_ACCESS_HISTORY
GROUP BY IP
) x
JOIN USER_ACCESS_HISTORY t ON x.IP =t.ip
AND x.ACCESSS_DATE = t.ACCESSS_DATE
WHERE x.IP ='192.168.1.5'
这将保留关系,并将数据过滤到所需的IP。
即使这样看起来也比您需要的要复杂得多(仅仅是子查询就足够了),但是我假设我们看到的只是查询的一个压缩版本来说明这个问题。我确实提出了它,以防您可以像这样减少查询:
SELECT IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
FROM USER_ACCESS_HISTORY
WHERE IP = '192.168.1.5'
GROUP BY IP
发布于 2018-07-25 06:12:01
您的版本将获取与给定ip的最大日期相同的所有ip
。也就是说,它缺少一个关于x.ip
和t.ip
相等的附加条件。
如果只需要ip
和date,那么就不需要外部查询--子查询生成这两个列。
就我个人而言,我将使用相关子查询:
select uah.*
from user_access_history uah
where uah.access_date = (select max(uah2.access_date)
from user_access_history uah2
where uah2.ip = uah.ip
);
您可以将where
子句添加到外部查询。
使用user_access_history(ip, access_date)
上的索引,这应该比您的问题所建议的版本更快。
发布于 2018-07-25 06:18:50
因为你已经知道了IP,所以实际上你不需要任何joins:
SELECT IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
from USER_ACCESS_HISTORY
where IP ='192.168.1.5'
group by IP
https://stackoverflow.com/questions/51508213
复制相似问题