关于 Oracle 中的 HAVING 语句

About HAVING statement in Oracle

我想在查询中做这样的事情。

GROUP BY act.date, d.causedat, x, y, z...
HAVING  MAX(act.date_) OVER (PARTITION BY act.date_ <= d.causedat)

这在某种程度上可能吗?

我正在尝试根据低于 d.causedat 的 act.date_ 的最大日期(两者都是日期在相同的格式)

目前,做一个简单的 select max(act.date_) where act.date_ <= d.causedat 并没有给我单一结果,而是不同结果的集群,但我真的只想列出第一个(最新日期)。

为了更加清晰而编辑:

进去是 48 tables,由一个 union 连接在一起,提供了大量的事件和时间戳。等待此数据的是总共 200 行的 select 语句以及另外 10 个连接。我通过查看在较小的 select 语句中的时间戳之前发生的联合中的最大时间戳,加入了此 table 的联合。可以这样想。假设我正在尝试将该行与日期 2012/01/01/1233 匹配。

date_            -   event            - event id
2012/01/01/1230 |    1#1#foo          |  1
2012/01/01/1231 |    2#1#foo#bar      |  1
2012/01/01/1232 |    1#1#foo#bar#etc  |  1

只有最后一个与我相关,所以我正在寻找 max(date_)

另一方面,我有一个 table,其中列出了 causedat,我想要拍摄的日期并与 max(date_) 进行比较,我想拍摄这个日期并且然后取直接处理它的date_

结果将如下所示:

x    -    y    -  event            -    date_           - causedat
info -    info -  1#1#foo#bar#etc  -    2012/01/01/1232 - 2012/01/01/1233

我对这一切的问题是:可以用一组 by/having 语句来完成吗?

检查 Oracle 中的 LAST_VALUE 或 FIRST_VALUE 函数。 http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions073.htm

有一些使用上的困难,但可能会解决你的问题。我的例子:

SELECT * FROM (
    SELECT x, y, z, 
      LAST_VALUE(date1)
      OVER (PARTITION BY x,y,z ORDER BY date2 range between current row and unbounded following) my_date1,
      FROM table
) group by x,y,z,my_date1

如果你把你的全部贴出来select我可以帮你做声明

不太清楚你想做什么。 听起来您想要分组依据并对结果进行排名。 也许这会有所帮助:

select * from (
    select act.date, d.causedat, x, y, z, max(act.date_),
     row_number() over (PARTITION BY act.date, d.causedat, x, y, z order by act.date_ DESC) as num_rank
     from TABLE 
     where act.date_ <= d.causedat
     group by ct.date, d.causedat, x, y, z
 ) where num_rank = 1

如果您在每个事件 ID 的指定日期之前或之内找到最大日期的行,那么也许这就是您要查找的内容:

with sample_data as (select to_date('2012/01/01/1230', 'yyyy/mm/dd/hh24mi') date_, '1#1#foo' event, 1 event_id from dual union all
                     select to_date('2012/01/01/1231', 'yyyy/mm/dd/hh24mi') date_, '2#1#foo#bar' event, 2 event_id from dual union all
                     select to_date('2012/01/01/1232', 'yyyy/mm/dd/hh24mi') date_, '1#1#foo#bar#etc' event, 1 event_id from dual union all
                     select to_date('2012/01/01/1234', 'yyyy/mm/dd/hh24mi') date_, '5#1#foo#bar#etc#etc' event, 1 event_id from dual)
-- end of mimicking a table with your sample_data in it
select date_,
       event,
       event_id
from   (select date_,
               event,
               event_id,
               row_number() over (partition by event_id order by date_ desc) rn
        from   sample_data
        where  date_ <= to_date('2012/01/01/1233', 'yyyy/mm/dd/hh24mi'))
where  rn = 1;

DATE_             EVENT                 EVENT_ID
----------------- ------------------- ----------
2012/01/01/1232 1#1#foo#bar#etc              1
2012/01/01/1231 2#1#foo#bar                  2