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 的最后卸载行,那么你必须相应地调整查询。
我正在尝试获取 特定 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 的最后卸载行,那么你必须相应地调整查询。