我试图获取IP,用户,并从其中可以同时包含了用户当前的IP和一个或多个在先IPS表最近的时间戳。 我想对于包含最新的IP和相关的时间戳每个用户一行。 因此,如果一个表是这样的:
username | ip | time_stamp
--------------|----------|--------------
ted | 1.2.3.4 | 10
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
我期望查询的输出是:
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
我可以在一个SQL查询做到这一点? 在它的事项的情况下,DBMS是PostgreSQL的。
试试这个:
Select u.[username]
,u.[ip]
,q.[time_stamp]
From [users] As u
Inner Join (
Select [username]
,max(time_stamp) as [time_stamp]
From [users]
Group By [username]) As [q]
On u.username = q.username
And u.time_stamp = q.time_stamp
与ROW_NUMBER窗函数尼斯完美的解决方案(PostgreSQL支持-参见SQL小提琴 ):
SELECT username, ip, time_stamp FROM (
SELECT username, ip, time_stamp,
ROW_NUMBER() OVER (PARTITION BY username ORDER BY time_stamp DESC) rn
FROM Users
) tmp WHERE rn = 1;
事情是这样的:
select *
from User U1
where time_stamp = (
select max(time_stamp)
from User
where username = U1.username)
应该这样做。
上述两个答案假设你只需要为每个用户和TIME_STAMP一行。 根据不同的应用程序和您TIME_STAMP的粒度,这可能不是一个有效的假设。 如果您需要处理TIME_STAMP给定用户的关系,你需要扩展上面给出的答案之一。
要在一个查询写这需要另一个嵌套子查询 - 事情会开始越来越多地凌乱和性能可能会受到影响。
我会喜欢添加这是一个评论,但我还没有50美誉张贴作为一个新的答案很抱歉!
不能发表评论,但@Cristi小号的答案工程请客我。
在我的方案,我需要只保留最近的3条记录Lowest_Offers所有product_ids。
需要重新修改他的SQL删除 - 认为,这将是确定的,但语法是错误的。
DELETE from (
SELECT product_id, id, date_checked,
ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY date_checked DESC) rn
FROM lowest_offers
) tmp WHERE > 3;
我一直在使用这个,因为我要回的另一个表结果。 虽然我试图避免嵌套的加入,如果有帮助瓦特/少了一个步骤。 那好吧。 它返回同样的事情。
select
users.userid
, lastIP.IP
, lastIP.maxdate
from users
inner join (
select userid, IP, datetime
from IPAddresses
inner join (
select userid, max(datetime) as maxdate
from IPAddresses
group by userid
) maxIP on IPAddresses.datetime = maxIP.maxdate and IPAddresses.userid = maxIP.userid
) as lastIP on users.userid = lastIP.userid