如何仅在该特定组内按结果查找组中未排序的一组行?

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

以上是关于如何仅在该特定组内按结果查找组中未排序的一组行?的主要内容,如果未能解决你的问题,请参考以下文章

如何填充一列以区分 Impala 组中的一组行与其他行?

根据来自另一个表的匹配行查找表中的一组行

注释掉 shell 脚本中的一组行

如何通过 created_at 对一组行进行排序?

mysql5.7 mysql8窗口函数分组排序并在组内编号

如何根据列中的一组行对数据框进行排名?