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 子句
SELECT FROM Table WHERE 不部分的确切数字在字符串 SQL 中