关于Oracle中的HAVING语句

时间:2015-10-22 09:55:29

标签: oracle group-by having

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

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个表,由一个联合连接在一起,提供大量的事件和时间戳。等待这个数据是200行总选择语句,另外还有10个连接。我通过查看在较小的select语句中的时间戳之前发生的联合中的最大时间戳来加入联接到此表的联合。想想这样。让我们假设我试图将该行与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_)

另一方面,我有一张表格列出causedat,我想拍摄的日期并与max(date_)进行比较,我想拍这个日期,然后拍下{{1直接对它进行处理。

结果将如下所示:

date_

我对这一切的疑问是:可以通过/发表声明来完成。

3 个答案:

答案 0 :(得分:0)

检查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

如果您粘贴整个选择,我可以帮助您声明。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您在每个活动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