如何仅在该特定组内按结果查找组中未排序的一组行?
Posted
技术标签:
【中文标题】如何仅在该特定组内按结果查找组中未排序的一组行?【英文标题】:How to find an unsorted set of rows in a group by result only inside that particular group? 【发布时间】:2021-05-29 21:34:03 【问题描述】:例如:
enter image description here
假设表名是 AMAN,它有超过 20 列和超过 20000 行
在这个查询之后:
SELECT id, line_no, date
FROM AMAN
where id in (select id from AMAN group by id);
结果:
我们可以看到 id 为 10000 和 20000 的组正在对日期进行排序。
当对应的日期没有相对于 line_no 排序时,我只需要 id 一次。
在这种情况下,我需要 30000 作为所需的输出,因为日期相对于 line_no 处于 未排序的顺序。
谁能帮我构建一个类似的查询?
【问题讨论】:
【参考方案1】:你没有提到具体的数据库,所以我会为它提供一个通用的解决方案。该示例在 PostgreSQL 中运行。
您可以使用LAG()
窗口函数根据您想要的排序顺序查看前一行中的值。
例如:
select distinct id
from (
select *,
case when lag(d) over(partition by id order by line_no) > d
then 1
else 0
end as unsorted
from aman
) x
where unsorted = 1
结果(见running example at DB Fiddle):
id
-----
30000
SQL 脚本数据集:
create table aman (id int, line_no int, d date);
insert into aman (id, line_no, d) values
(10000, 1, date '2019-05-13'),
(10000, 2, date '2020-05-13'),
(10000, 3, date '2021-05-13'),
(20000, 1, date '2015-06-14'),
(20000, 2, date '2017-06-15'),
(30000, 1, date '2024-05-13'),
(30000, 2, date '2020-05-13'),
(30000, 3, date '2022-05-13');
为 ORACLE 编辑
稍作修改,查询在Oracle中工作,如下所示:
select distinct id
from (
select aman.*,
case when lag(d) over(partition by id order by line_no) > d
then 1
else 0
end as unsorted
from aman
) x
where unsorted = 1
见running example in Oracle。
【讨论】:
非常感谢您的帮助。运行此查询时出现错误。那么在开始的记录没有分组,我写的第一个查询是对它们进行分组。现在分组后我需要找到未排序的。 . .你能不能给我一个查询,它会一次性完成整个事情,基本上结合了两个查询 @AmanSingh 我刚刚在 PostgreSQL 中尝试过并且运行良好。见db-fiddle.com/f/fv564vD58Q9kSbYPVwEG9F/0 @AmanSingh 如果您使用的是 Oracle 数据库,请相应地标记您的问题。而且...答案也应该适用于 Oracle。 您好,它在 oracle 数据库中运行良好。但是,如果现有列还有更多列,那么它会再次停止工作并提供额外的 id以上是关于如何仅在该特定组内按结果查找组中未排序的一组行?的主要内容,如果未能解决你的问题,请参考以下文章