postgresql Spanner:为集合中的每个项目查询N个子项目(1对多)(没有窗口函数)

w8f9ii69  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(118)

我有一个存储在扳手中的聊天类型系统,表如下:

Table: Chat
 - ChatId STRING(64)
 - ... etc ...

Table: Message
 - MessageId  STRING(64)
 - ChatId     STRING(64)
 - CreateTime TIMESTAMP

我试图找出一种性能良好的方法来查询ChatId集合中每个聊天的最近N条消息。因此,给定10个聊天ID,我想查询20条消息,其中包括10个聊天中每个聊天的最新2条消息。
我认为窗口函数通常适合于此,但显然Spanner不支持这些。
如果不对按CreateTime排序的带有LIMITN的消息执行10次查询,是否可能这样做

s2j5cfk0

s2j5cfk01#

是的,可以在一次查询中完成。我试过了
示例代码:

SELECT 
  * 
FROM 
  (
    SELECT 
      chatid, 
      messageid, 
      createtime, 
      RANK() OVER(
        PARTITION BY chatid 
        ORDER BY 
          createtime DESC
      ) AS mostrecent 
    FROM 
      Message
  ) 
WHERE 
  chatid IN (insert chatids) 
  AND mostrecent <= N

希望有帮助

相关问题