【问题标题】:Finding all records with more than 3 values in one column between other two values in that column在该列中的其他两个值之间查找一列中超过 3 个值的所有记录
【发布时间】:2017-04-18 11:36:25
【问题描述】:

例如我有桌子:

COL_0   COL_1   COL_2
11111   BBBB    RECORD DELETED
11111   BBBB    RECORD ADDED
11111   AA      lalala
11111   BBBB    RECORD ADDED
11111   AA      lalala
11111   CCCCCC  RECORD ADDED
11111   AA      lalala
11111   BBBB    RECORD ADDED
11111   AA      lalala
11111   BBBB    RECORD ADDED
11111   CCCCCC  RECORD ADDED
11111   AA      lalala
11111   BBBB    RECORD DELETED
11111   AA      lalala
11111   BBBB    RECORD ADDED
11111   BBBB    RECORD ADDED
11111   AA      lalala
11111   CCCCCC  RECORD ADDED
11111   AA      lalala
11111   BBBB    RECORD DELETED
11111   AA      lalala
11111   BBBB    RECORD ADDED
11111   AA      lalala
11111   BBBB    RECORD ADDED
11111   CCCCCC  RECORD ADDED
11111   AA      lalala
11111   BBBB    RECORD DELETED

COL_0 是 id,在实际表中有许多不同的 id。 COL_1 链接到另一个表。 COL_2 是对其他表的操作。

这是无法改变的。问题是应用程序无法正常工作并在某些情况下删除记录。现在我需要找到两个“记录已删除”之间的所有 id 超过 3 个“记录添加”。有什么办法吗?

兄弟,

【问题讨论】:

  • SQL 表代表 无序 集。您需要一列指定行的顺序。
  • 再详细点,你是不是有每个操作的时间相关信息-timestamp?没有它,你真的什么都做不了
  • 有创建和更改时间。我必须在六个月前找到所有东西,但我不知道更准确。

标签: sql oracle


【解决方案1】:

是的,您可以通过使用分析函数来做到这一点——假设您有一个指定排序的列。我假设有一个包含此信息的 dte 列。

我将从识别组开始,使用记录删除记录的累积总和。然后我会计算每个组中添加的记录:

select id, min(dte), max(dte)
from (select t.*,
             sum(case when col_2 = 'RECORD DELETED' then 1 else 0 end) over (partition by col_1 order by dte) as grp
      from t
     ) t
where col_2 = 'RECORD ADDED'
group by id, grp
having count(*) >= 3;

注意:这给出了发生这种情况的每一次发生。如果您真的只想要 id,那么您可以将 select distinctgroup by 一起使用——这是一个合适的解决方案的罕见情况之一:

select distinct id
from (select t.*,
             sum(case when col_2 = 'RECORD DELETED' then 1 else 0 end) over (partition by col_1 order by dte) as grp
      from t
     ) t
where col_2 = 'RECORD ADDED'
group by id, grp
having count(*) >= 3;

【讨论】:

  • 是的,有指定顺序的列。谢谢,我会尝试一下并报告。
  • 我遗漏了一些东西...我使用 from (select t.*, sum(case when col_2 = 'RECORD DELETED' then 1 else 0 end) over (partition by col_1 order by dte) as grp from table_name t ) t 并返回 table 中的每个 id。
  • @MikeL 。 . .那是子查询。外部查询只返回带有RECORD ADDED 的行。您是否运行了完整的查询。
  • 是的,我只粘贴这个,因为只有新的东西是 table_name "...from table_name t) t where col_2 = 'RECORD ADDED'..."。
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多