如何对具有相同“模块”的连续行批次的结果进行分组

Mör*_*rre 6 oracle

我正在寻找一个看似非常简单的 SELECT。

我有一个日志记录表 LOGGING,其中我感兴趣的三列是:MODULE(文本)、PDATE(日期)、PTEXT(文本)。

实际上,我只关心前两列,即到底调用了哪个模块(PL/SQL 包中的过程名称)。我只需要对结果进行排序 (ASC) 的日期,也可以出于相同目的使用 ID 列,它是一个自动递增的整数值(Oracle:sequence.nextval)。

由于日志记录产生了太多的数据,单个 MODULE 有数十到数百个 PTEXT 条目,我想压缩 MODULE 行,这似乎需要一个简单的 GROUP BY。

也许这说明了这个问题:

我从下面的内部查询开始,它为我提供了正确的“模块”调用顺序,但没有聚合它们(上面的示例 1)。所以我的想法是好的,我以正确的顺序得到正确的结果 - 所以如果我现在只选择我感兴趣的一列并在这个有序(!)数据上使用“分组依据”,我应该得到我想要的 -但是在下面添加“分组依据”给了我一个完全不同的顺序。显然,我对“group by”的了解是不够的。

SELECT module FROM
(
  SELECT module, pdate FROM logging
  ORDER BY pdate asc
)
--GROUP BY module
Run Code Online (Sandbox Code Playgroud)

没有“GROUP BY”的结果(前 12 行):

set_option_value
set_option_value
set_option_value
set_option_value
get_rights_usecase
get_rights_usecase
get_rights_usecase
get_rights_usecase
get_rights_usecase
get_rights_usecase
get_fun_AppOptionsSingleVal
get_rights_usecase
...
Run Code Online (Sandbox Code Playgroud)

结果包括 “通过...分组”:

get_fun_AppOptionsSingleVal
get_option_value
get_parameter
get_usecase_customer
get_kungesId_FY_cusper
fill_missing_products
update_chart_budget_uc1
get_Berein
set_hierarchy
get_element_num_value
icas_dyn_create_chart_table
get_xmlTemplate
...
Run Code Online (Sandbox Code Playgroud)

正如人们所见,“GROUP BY”产生了完全不同的顺序。

我想要的:

set_option_value
get_rights_usecase
get_fun_AppOptionsSingleVal
get_rights_usecase
...
Run Code Online (Sandbox Code Playgroud)

基本上,我想要的东西可以通过获取文本输出来非常简单地实现

  SELECT module FROM logging
  ORDER BY pdate asc
Run Code Online (Sandbox Code Playgroud)

并通过 Unix 命令行上的“uniq”进行管道传输。现在我很好奇为什么这在 SQL 中不那么简单。

Jac*_*las 5

问题是您想使用pdatea 中的哪个smodule进行排序?

如果您愿意使用最大的,您可以使用:

select module from logging order by max(pdate); 
Run Code Online (Sandbox Code Playgroud)

- - 编辑

我想我现在明白了——你可能想要这样的东西:

select module
from( select module, 
             sum(module_step) over (order by pdate rows unbounded preceding) 
                 as batch_number, 
             pdate
      from( select module, 
                   case lag(module) over (order by pdate) when module then 0 
                        else 1 end as module_step, 
                   pdate from logging) )
group by module, batch_number
order by batch_number;
Run Code Online (Sandbox Code Playgroud)