如何查询 sql 以获取最新的记录日期,但如果记录有消息返回该 reocrd [关闭]
Posted
技术标签:
【中文标题】如何查询 sql 以获取最新的记录日期,但如果记录有消息返回该 reocrd [关闭]【英文标题】:how do I query sql for a latest record date but if the record has a message return that reocrd [closed] 【发布时间】:2020-07-08 16:11:00 【问题描述】:从这个示例表中,我需要第 2 行和第 3 行。
【问题讨论】:
这里的大多数人都希望样本表数据和预期结果为格式化文本,而不是图像。也看看minimal reproducible example。 您使用的是哪个 dbms? 我可以假设您需要为每个 compId 提供一条记录,但是当您提出问题时,您确实需要更具体 @Eugene 是的,我需要每个 compId 的单个记录 如果您有 2 条记录对单个 comp 有评论怎么办? 【参考方案1】:我了解您想要每个 compID
的最新非空消息,或者如果所有消息都是空的,则需要最新消息。
如果是这样,您可以使用窗口函数:
select id, compID, date, message
from (
select
t.*,
row_number() over(
partition by compID
order by case when message is not null then 0 else 1 end, date desc
) rn
from mytable t
) t
where rn = 1
order by id
Demo on DB Fiddle:
编号 |组合ID |日期 |信息 -: | :----- | :--------- | :---------- 2 |乙| 2020-03-27 | 空 3 |一个 | 2020-03-22 |你好世界【讨论】:
您的查询返回记录 1 和 2,我需要记录 2 和 3。CompId: 'A' with the latest date '2020-03-24' 没有消息,所以我想要记录 3 有信息。但如果两条记录都没有消息,那么我想要最新的记录。 @BilalKhan:是的,我明白了,该查询应该按预期工作。第1行message的内容是什么,是null
吗?
@BilalKhan:我在答案中添加了一个演示供您参考。这似乎按预期工作。
第 1 行消息为空。
@BilalKhan:如果你有一个空字符串而不是null
,你需要更改窗口函数over(partition by CompID order by case when message <> '' then 0 else 1 end, date desc
的over()
子句【参考方案2】:
SELECT t.*
FROM #tmp t JOIN (SELECT CompID, MAX(Date) AS DateMax, MAX(CASE WHEN Message IS NOT NULL THEN ID END) AS MsgMaxID
FROM #tmp
GROUP BY CompID) agt ON (t.ID = agt.MsgMaxID OR (agt.MsgMaxID IS NULL AND t.CompID = agt.CompID AND t.Date = agt.DateMax))
【讨论】:
【参考方案3】:这个查询应该选择你需要的:
Select T.*
from your_table T
Inner join (
Select compId, max(date) as maxDate
From your_table
Where message is not null
Group by compId
Union
Select compId, max(date) as maxDate
From your_table
Where compId not in (select compId from your_table where message is not null )
Group by compId
) Last on Last .compId = T.compId and Last.maxDate = T.date
【讨论】:
您的查询返回记录 1 和 2,我需要记录 2 和 3,因为 compId: 'A' 有一条消息。抱歉,我之前没有理解您的问题。 我明白了,我已经更新了查询,检查一下 我得到的结果和以前一样。 再次更新。一定是这样的 仍然得到相同的结果。以上是关于如何查询 sql 以获取最新的记录日期,但如果记录有消息返回该 reocrd [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Sql 查询以获取最多 10 条的最新记录并按提到行排名的字段排序 [关闭]