当我运行以下查询时:
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
谢谢!
答案 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