SQL 查询所有不是最新的记录

SQL query for all records that are not the most recent

我正在尝试获取 特定 individualid(在此示例中为 'nest22')的所有条目的所有 record_ids 当前不是 已加载 不是最新的。我为获取最新的 record_id 而写的查询有效,但是当我尝试根据结果进行过滤时,有些东西已经关闭,我似乎无法弄清楚我做错了什么

SELECT record_id AS recid, individualid AS ind, load_status AS load
  FROM tbl t1
  LEFT JOIN (SELECT record_id, individualid , load_status, created_at
               FROM tbl
              INNER JOIN( SELECT individualid AS indid,
                                 MAX( created_at) AS max_create
                            FROM tbl
                           GROUP BY individualid) ms ON individualid = indid 
                                                     AND created_at = max_create
              WHERE individualid LIKE 'nest22'
                AND load_status NOT LIKE 'LOADED') t2 ON recid = record_id
 WHERE load NOT LIKE 'LOADED'
   AND individualid LIKE 'nest22'
   AND record_id = NULL

table本身看起来像这样

record_id  | individualid | created_at | load_status
-----------+--------------+------------+------------
1          |nest22        |9/16/2021   | PENDING
2          |nest22        |9/13/2021   | PENDING
3          |nest22        |9/10/2021   | PENDING
4          |nest22        |9/1/2021    | LOADED
5          |nest23        |9/10/2021   | PENDING

我想查询 return record_id 的 2 & 3

这是 NOT IN 的工作。让我们从一个子查询开始,获取最近合格记录的日期。

                      SELECT individualid, MAX(created_at) created_at
                        FROM tbl
                       WHERE load_status <> 'LOADED'
                       GROUP BY individualid

然后,让我们将其包装在另一个子查询中以获取最近记录的 record_ids。

              SELECT a.record_id
                FROM tbl a
                JOIN (
                      SELECT individualid, MAX(created_at) created_at
                        FROM tbl
                       WHERE load_status <> 'LOADED'
                       GROUP BY individualid
                     ) b   ON a.individualid = b.individualid
                          AND a.created_at = b.created_at

然后,让我们在主查询中使用它。 Check it out here.

SELECT record_id AS recid, individualid AS ind, load_status AS load
  FROM tbl
 WHERE record_id NOT IN (
              SELECT a.record_id
                FROM tbl a
                JOIN (
                      SELECT individualid, MAX(created_at) created_at
                        FROM tbl
                       WHERE load_status <> 'LOADED'
                       GROUP BY individualid
                     ) b   ON a.individualid = b.individualid
                          AND a.created_at = b.created_at
                )
  AND load_status <> 'LOADED'
  AND individualid = 'nest22'

您尚未回答您使用的是哪个 DBMS,因此这里是标准 SQL 查询的答案。

您想显示除

以外的所有行
  • 最新行
  • 具有个人 ID <> 的行 'nest22'
  • 行 load_status = 'LOADED'

这里重要的是要考虑应用标准的顺序。如果我们只选择具有匹配的 individualid 和 load_status 的行,那么我们无法从这个数据集中看到它的其中一行是否是最新的行,因为我们不知道我们的标准是否已经删除了最新的行或不是。我们将不得不再次查找原始 table。但是,如果我们首先删除最新的行,那么我们可以从该数据集中删除不需要的 individualid 和 load_status。

这里有两个选项:

查询#1

select *
from tbl
where individualid = 'nest22'
and load_status <> 'LOADED'
and created_at <> (select max(created_at) from tbl);

查询#2

select *
from
(
  select *
  from tbl
  order by created_at desc
  offset 1 row
) without_newest
where individualid = 'nest22'
and load_status <> 'LOADED';

两个查询都认为 created_at 在 table 中是唯一的,因此最大的 created_at 表示最新的行。

还有其他方法可以达到同样的效果。最新的行是具有最大日期的行,也可以表示为不存在具有更大日期的其他行的行,即我们可以为此使用 EXISTS 子句。我们还可以按降序对行进行编号(ROW_NUMBER)并跳过第 1 行,因为那将是最新的。

最后看到你忘了告诉我们你的查询有语法错误,忘了回答关于DBMS的问题,忘了回答record_id在[=53=中是否唯一],很可能是您没有正确描述任务。例如,如果这不是关于 table 中的最新行,而是关于 nest22 的最新行或最后卸载的行或 nest22 的最后卸载行,那么你必须相应地调整查询。