关于 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
我想在查询中做这样的事情。
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