Sql 查找表中每个id的最后5个结果(按eventdate排序)
我需要从测试表中找到eventdate为每个id排序的最后5个结果 该表的结构如下图所示,仅显示1个id记录中的数据,其中有数千个不同的id,所有id在时间上都有不同的结果,因此我只希望返回最后5个id记录 我有一个几乎正确的查询,但是它包括num_result=0和auditflag=2,计数小于6,这当然是因为我的代码是新手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
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