Sql 查找表中每个id的最后5个结果(按eventdate排序)

Sql 查找表中每个id的最后5个结果(按eventdate排序),sql,vba,postgresql,excel,Sql,Vba,Postgresql,Excel,我需要从测试表中找到eventdate为每个id排序的最后5个结果 该表的结构如下图所示,仅显示1个id记录中的数据,其中有数千个不同的id,所有id在时间上都有不同的结果,因此我只希望返回最后5个id记录 我有一个几乎正确的查询,但是它包括num_result=0和auditflag=2,计数小于6,这当然是因为我的代码是新手 SELECT q1.id, q1.eventdate, q1.num_result " _ & "FROM test AS q1 INNER

我需要从测试表中找到eventdate为每个id排序的最后5个结果

该表的结构如下图所示,仅显示1个id记录中的数据,其中有数千个不同的id,所有id在时间上都有不同的结果,因此我只希望返回最后5个id记录

我有一个几乎正确的查询,但是它包括num_result=0和auditflag=2,计数小于6,这当然是因为我的代码是新手

    SELECT q1.id, q1.eventdate, q1.num_result " _
      & "FROM test AS q1 INNER JOIN test AS q2 ON ( q1.id = q2.id ) " _
            & "AND ( q1.eventdate <= q2.eventdate ) AND q1.auditflag=1 " _
        & "WHERE q1.num_result > 0 " _
        & "GROUP BY q1.id, q1.eventdate, q1.num_result " _
        & "HAVING COUNT(*) < 6 " _
        & "ORDER BY q1.id, q1.eventdate DESC 
我只想找到匹配的最后5条记录,即以黄色突出显示的记录,即num_result>0且auditflag=1的记录中的最后5条记录


SQL查询是用Excel VBA编写的,使用visoledb连接到PG数据库。如果我理解正确,这基本上就是您的查询:

SELECT q1.id, q1.eventdate, q1.num_result 
FROM test q1 INNER JOIN
     test q2
     ON q1.id = q2.id AND
        q1.eventdate <= q2.eventdate AND q1.auditflag = 1 
WHERE q1.num_result > 0
GROUP BY q1.id, q1.eventdate, q1.num_result 
ORDER BY q1.id, q1.eventdate DESC ;
我想你需要这个过滤器:

SELECT q.*
FROM (SELECT q.id, q.eventdate,
             SUM( (q.auditflag = 1)::int) OVER (PARTITION BY q.id ORDER BY event_date DESC) as num_result
     FROM test q
    ) q
WHERE num_result <= 5;

此类查询通常通过以下方式解决:


至于索引,id、eventdate DESC index on test也会有很大帮助,您可以将其设置为num_result>0,auditflag=1。

这是最终对我有效的代码,尽管我必须使用一个标识字段,它是全局auditsequence和唯一的记录标识符。我不知道这一点,直到我问为什么什么都不起作用,但希望答案可以帮助其他人。感谢所有在这方面帮助我的人

select id, eventdate, num_result
from test
where test.identity IN
  (select top 5 identity from test as q1
  where q1.id=test.id and q1.auditflag=1 and q1.num_result>0 
  order by q1.eventdate desc)
order by id, eventdate desc

我在第1行收到一条错误消息,其中包含两个翻译错误查询;想不到的Symbol@BradleyS . . . 它是否指向查询中的任何特定位置?我看不出有什么明显的错误。它必须是VBA或visoledb连接到PG,不能接受要使用的代码的某些元素。谢谢您的帮助,但我想我必须尝试使用VBA来实现这一点。@BradleyS。尝试使用cast而不是::int。这是非常不标准的,可能是问题的原因。
SELECT   id, eventdate, num_result
FROM     (SELECT id, eventdate, num_result,
                 row_number() OVER (PARTITION BY id ORDER BY eventdate)
          FROM   test
          WHERE  num_result > 0
          AND    auditflag = 1) q
WHERE    row_number <= 5
ORDER BY id, eventdate DESC
select id, eventdate, num_result
from test
where test.identity IN
  (select top 5 identity from test as q1
  where q1.id=test.id and q1.auditflag=1 and q1.num_result>0 
  order by q1.eventdate desc)
order by id, eventdate desc