SQL SELECT 最近创建的行 WHERE something is true

Posted

技术标签:

【中文标题】SQL SELECT 最近创建的行 WHERE something is true【英文标题】:SQL SELECT most recently created row WHERE something is true 【发布时间】:2021-01-20 04:17:27 【问题描述】:

我正在尝试选择最近创建的行,其中行中的 ID 字段是某个数字,所以我不想要 WHOLE 表中最近创建的行,而是最近创建的 WHERE ID 字段是一个特定的数字。

我的桌子:

表:

   |   name  |   value    |   num |SecondName|    Date      |  
   | James   |   HEX124   |   1   |  Carl    |   11022020   |  
   | Jack    |   JEU836   |   4   |  Smith   |   19042020   |   
   | Mandy   |   GER234   |   33  |  Jones   |   09042020   |  
   | Mandy   |   HER575   |   7   |  Jones   |   10052020   |  
   | Jack    |   JEU836   |   4   |  Smith   |   14022020   |   
   | Ryan    |   GER631   |   33  |  Jacque  |   12042020   |  
   | Sarah   |   HER575   |   7   |  Barlow  |   01022019   |  
   | Jack    |   JEU836   |   4   |  Smith   |   14042020   |   
   | Ryan    |   HUH233   |   33  |  Jacque  |   15042020   |  
   | Sarah   |   HER575   |   7   |  Barlow  |   02022019   |   

我的 SQL:

SELECT name, value, num, SecondName, Date
FROM MyTable 
INNER JOIN (SELECT NAME, MAX(DATE) AS MaxTime FROM MyTable GROUP BY NAME) grouped ON grouped.NAME = NAME

WHERE NUM = 33
AND grouped.MaxTime = Date

我在这里所做的是选择表,并创建一个内部联接,我在其中获取 MAX 日期值(最大/最新值),并按名称分组,因此这将返回最新创建的行,对于每个人(姓名),其中 NUM 字段等于 33。

结果:

   | Ryan    |   HUH233   |   33  |  Jacque  |   15042020   |  

如您所见,它返回一行,因为有 3 行的 NUM 值为 33,其中两行名称为“Ryan”,因此它按名称分组,并返回最新条目为瑞安(这很好用)。

但是,Mandy 不见了,正如您在我的第一个表中看到的那样,她有两个条目,一个在 NUM 值以下 33,另一个具有 NUM 值 7。因为 NUM 值为 7 的条目是最近创建的,我说“grouped.MaxTime = Date”的查询正在占用该行,并且它没有被显示,因为 NUM 值不是 33。

我想要做的是读取每一行,其中 NUM 字段为 33,然后选择值为 33 的行内的最大时间。

我相信它在做什么,首先优先考虑最大日期值,然后过滤 NUM 值为 33 的选定字段。

期望的结果:

   | Ryan    |   HUH233   |   33  |  Jacque  |   15042020   |  
   | Mandy   |   GER234   |   33  |  Jones   |   09042020   |  

任何帮助将不胜感激,谢谢。

【问题讨论】:

请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。 重新确定您的目标:这是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 您要的是什么 DBMS?请始终使用您正在使用的 DBMS 标记 SQL 问题。 【参考方案1】:

如果我没听错的话,你可以使用子查询进行过滤:

select t.*
from mytable t
where t.num = 33 and t.date = (
    select max(t1.date) from mytable t1 where t1.name = t.name and t1.num = t.num
)

【讨论】:

【参考方案2】:

查看您的子查询。您想要 num 33 的最大日期,但您选择独立于 num 的最大日期。

我想你想要:

select * 
from mytable
where (name, date) in
(
  select name, max(date)
  from mytable
  where num = 33
  group by name
);

【讨论】:

以上是关于SQL SELECT 最近创建的行 WHERE something is true的主要内容,如果未能解决你的问题,请参考以下文章

SQL笔记SQL语法SELECT语句DISTINCT语句LIMITLIMIT和OFFSET组合使用WHERE 子句

SQL查询包含汉字的行

SELECT FROM Table WHERE 不部分的确切数字在字符串 SQL 中

怎么查看oracle创建的序列?

SQL中where和group by可以连用吗?having算是对检索条件的补充吗?

IN vs = in Where 子句