Oracle - 从输出中将行合并为1

时间:2012-10-20 07:37:51

标签: sql oracle

当我运行以下查询时:

SELECT datetime_up, logic_id,eqp_name,ack, created FROM NAS_db.main WHERE TRUNC(datetime_up,'DD') >= TO_TIMESTAMP ('04/18/2012', 'MM/DD/YYYY') and TRUNC(datetime_up,'DD') <= TO_TIMESTAMP ('04/21/2012', 'MM/DD/YYYY') AND eqp_name ='Router-A' GROUP BY datetime_up,eqp_name, logic_id,ack,created

我得到以下输出:

datetime_up             logic_id    eqp_name      ack   created
4/19/2012 5:52:04 PM    IP_1.1.1.1_ Router-A       1       0

4/19/2012 5:52:04 PM    IP_1.1.1.1_ Router-A       0       0

好的,那些是连续的记录,我需要......在这样的情况下,第一条记录有1,只取一条,而不是2条。

我的意思是,如果我查询并且我有1000条记录在RouterA之后显示1,我将只需要一个,并且避免另一个,如果它们只是0,相同,只需要一个,所以我我想让我的查询显示出来。

4/19/2012 5:52:04 PM    IP_1.1.1.1_ Router-A       1       0

谢谢!

2 个答案:

答案 0 :(得分:1)

您正在按所有列进行分组,而不使用任何聚合函数,这相当于select distinct

假设ack只能为零或一,您可以在该列上使用max(),并将其从group by中排除:

SELECT datetime_up, logic_id, eqp_name, max(ack), created
...
GROUP BY datetime_up, eqp_name, logic_id, created

不确定created的行为方式,您可能也希望对该列执行相同操作。

在更复杂的情况下,您可以使用分析函数按某些条件对行进行排名,然后在外部select中进行过滤,但我认为这样做太过分了。

答案 1 :(得分:0)

尝试这个

SELECT datetime_up, logic_id,eqp_name,ack, created FROM NAS_db.main WHERE    
  TRUNC(datetime_up,'DD') >= TO_TIMESTAMP ('04/18/2012', 'MM/DD/YYYY') and 
TRUNC(datetime_up,'DD') <= TO_TIMESTAMP ('04/21/2012', 'MM/DD/YYYY') AND eqp_name 
='Router-A'  where ack and created!=0
 GROUP BY datetime_up,eqp_name, logic_id,ack,created

或将where条件更改为

 where ack=1