Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询以获取给定键的每个实例的最新行_Sql_Postgresql_Greatest N Per Group - Fatal编程技术网

SQL查询以获取给定键的每个实例的最新行

SQL查询以获取给定键的每个实例的最新行,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我试图从一个表中获取ip、用户和最近的时间戳,该表可能包含用户的当前ip和一个或多个以前的ip。我希望每个用户有一行包含最新的ip和相关的时间戳。因此,如果一个表如下所示: username | ip | time_stamp --------------|----------|-------------- ted | 1.2.3.4 | 10 jerry | 5.6.6.7 | 12 ted |

我试图从一个表中获取ip、用户和最近的时间戳,该表可能包含用户的当前ip和一个或多个以前的ip。我希望每个用户有一行包含最新的ip和相关的时间戳。因此,如果一个表如下所示:

username      |  ip      |  time_stamp  
--------------|----------|--------------  
ted           | 1.2.3.4  | 10  
jerry         | 5.6.6.7  | 12  
ted           | 8.8.8.8  | 30  
select * 
from User U1
where time_stamp = (
  select max(time_stamp) 
  from User 
  where username = U1.username)
我希望查询的输出是:

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
大概是这样的:

username      |  ip      |  time_stamp  
--------------|----------|--------------  
ted           | 1.2.3.4  | 10  
jerry         | 5.6.6.7  | 12  
ted           | 8.8.8.8  | 30  
select * 
from User U1
where time_stamp = (
  select max(time_stamp) 
  from User 
  where username = U1.username)

应该这样做。

以上两个答案都假设每个用户和时间戳只有一行。根据应用程序和时间戳的粒度,这可能不是一个有效的假设。如果需要处理给定用户的时间戳关系,则需要扩展上面给出的答案之一

要在一个查询中写入此命令,需要另一个嵌套的子查询-事情将开始变得更加混乱,性能可能会受到影响


我很想把这个作为一个评论,但我还没有50%的声誉,所以很抱歉作为一个新的答案发布

我一直在使用它,因为我正在从另一个表返回结果。尽管我试图避免嵌套联接,如果它有助于减少一步。哦,好吧。它返回相同的东西

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

漂亮优雅的解决方案,具有PostgreSQL支持的行数窗口功能-请参见:


现在还不能发表评论,但是@Cristi的回答对我来说很有用

在我的场景中,我只需要为所有产品标识保留最新的3条最低报价记录

需要修改他的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;

我在正确的轨道上,但我不能完全正确地加入。这就成功了。谢谢这在SQL Server中有效吗?在相似的数据上尝试了完全相同的方法,但我得到了每个ip的一行,以及最近的时间戳。用于HANA表,这产生了多行,其中1是预期的。HANA有很多东西与大多数流行的SQL引擎不一样。我认为这就是上述用户响应的答案。。。这不是开始回答问题的好方法。我怎么知道上面的答案是不是你指的?答案可以根据分数按不同的顺序出现。罗伯,我不认为你在告诉他一些他不知道的事情。他无法发表评论,他所指的答案显然有缺陷。更重要的是,传播知识或批评文本的放置位置?更正的SQL:从最低报价中删除,其中选择id中的id来自选择产品\u id、id、日期\u选中,按产品分区上的行数按日期排序检查最低的描述提供tmp,其中rn>3我认为这需要时间段上的描述索引这是最好的答案,因为它不涉及嵌套查询上的联接。唯一的问题是它需要在密钥中包含[ip]以及每个问题的用户名。如果时间戳是唯一的,并且您不能假设它是唯一的,那么这就行了。