【问题标题】:Sql query to find last item in a dateSql查询以查找日期中的最后一项
【发布时间】:2021-03-18 13:27:39
【问题描述】:

我在 sqlite 数据库中有 2 个表:Chats 和 Inboxcache。我需要加入这两个表,并创建一个收件箱列表。

收件箱项目将包含收件箱缓存中的所有记录,并找到该收件箱(对话)的最新聊天项目并获取其文本。

这是我目前的sql语句。

SELECT ch.ConversationID, Max(ch.Time) As Date, ch.Text, ic.SenderMessageName, ic.IsReader FROM ConversationHistoryDocument ch INNER JOIN InboxCache ic ON ic.ConversationID = ch.ConversationID WHERE ch.ConversationID ='{conversationId}' GROUP BY ch.ConversationID ORDER BY ch.Time Desc

它在大多数情况下都很好用,但如果聊天表有相同日期时间的记录。当它对收件箱缓存表进行内部连接时,它会选择第一条记录。但我需要最后一个。我应该如何为此更改 SQL 语句?

【问题讨论】:

  • 如果时间只显示日期 (YYYY/MM/DD) 我建议你也添加时钟。如果你也添加了时钟,我建议让时钟更精确,微秒或毫秒
  • 能否分享示例数据和预期结果。
  • @AFarmanbar : 时间保存在纪元时间(unix ticks)
  • @LibinJoseph 所以我建议在 WHERE 子句中使用记录的索引,更高的索引优先。
  • @LibinJoseph 你也可以在 SELECT 语句中使用Max(index)

标签: sql sqlite


【解决方案1】:

请试试这个:

with cte as (select *,row_number()over(order by time desc)rn from seConversationHistoryDocument )

SELECT ch.ConversationID, Max(ch.Time) As Date, ch.Text, ic.SenderMessageName, ic.IsReader 
FROM cte ch INNER JOIN InboxCache ic ON ic.ConversationID = ch.ConversationID 
WHERE ch.ConversationID ='{conversationId}' GROUP BY ch.ConversationID ORDER BY ch.Time Desc

【讨论】:

    【解决方案2】:
    SELECT ch.ConversationID,  
      min(ch.Time) AS DATE,  
      ch.Text,
      ic.SenderMessageName,
      ic.IsReader
    FROM ConversationHistoryDocument ch
    INNER JOIN InboxCache ic
    ON ic.ConversationID    = ch.ConversationID
    WHERE ch.ConversationID ='{conversationId}'
    GROUP BY ch.ConversationID
    ORDER BY ch.Time DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2014-12-06
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多