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' 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 ではなくその 1 つだけを取得することです。

つまり、クエリを実行し、RouterA の後に 1 を示す 1000 のレコードがある場合、1 つだけを取得し、もう 1 つを回避する必要があります。これを表示するクエリがあります。

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

ありがとう!

4

2 に答える 2

1

に相当する集計関数を使用せずに、すべての列でグループ化していますselect distinct

ackゼロまたは1のみであると仮定すると、その列で使用して、 :max()から除外できます。group by

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

どのようcreatedに動作するかわからない場合は、その列にも同じことを行うことをお勧めします。

より複雑な状況では、分析関数を使用して行をいくつかの基準でランク付けしてから、外側selectでフィルター処理することができますが、ここではやり過ぎだと思います。

于 2012-10-20T07:55:00.490 に答える
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
于 2012-10-20T07:50:40.133 に答える