3

Oracle クエリからレポートを作成しようとしています。データは次のようになります。

GROUP_ID | COUNT_1 | COUNT_2
    1    |   100   |   123
    1    |   101   |   123
    1    |   283   |   342
    1    |   134   |   123
    2    |   241   |   432
    2    |   321   |   920
    2    |   432   |   121
    2    |   135   |   342

私がしたいのは、グループの最初のときに GROUP_ID のみを返し、グループの最後のときに他の値を返すことです。

GROUP_ID | COUNT_1 | COUNT_2
    1    |   100   |   123
         |   101   |   123
         |   283   |   342
   last  |   134   |   123
    2    |   241   |   432
         |   321   |   920
         |   432   |   121
   last  |   135   |   342

これは可能ですか?

ありがとう!

4

3 に答える 3

3
CREATE TABLE tt(g NUMBER, c1 NUMBER, c2 NUMBER);
INSERT INTO tt VALUES(1, 100, 123);
INSERT INTO tt VALUES(1, 101, 123);
INSERT INTO tt VALUES(1, 283, 342);
INSERT INTO tt VALUES(1, 134, 123);
INSERT INTO tt VALUES(2, 241, 432);
INSERT INTO tt VALUES(2, 321, 920);
INSERT INTO tt VALUES(2, 432, 121);
INSERT INTO tt VALUES(2, 135, 342);

SELECT CASE WHEN 1=ROW_NUMBER() OVER (PARTITION BY g ORDER BY c1 ASC,  c2 ASC) THEN '1'
            WHEN 1=ROW_NUMBER() OVER (PARTITION BY g ORDER BY c1 DESC, c2 DESC) THEN 'Last'
            ELSE 'Empty'
        END answer,
       c1, c2
  FROM tt;

1        100  123
Empty    101  123
Empty    134  123
Last     283  342
1        135  342
Empty    241  432
Empty    321  920
Last     432  121
于 2013-06-13T11:15:03.453 に答える
1

lag()およびlead()分析関数を使用してみることができます。

with a as (
   select 1 group_id, 100 count_1, 123 count_2 from dual union all
   select 1 group_id, 101 count_1, 123 count_2 from dual union all
   select 1 group_id, 283 count_1, 342 count_2 from dual union all
   select 1 group_id, 134 count_1, 123 count_2 from dual union all
   select 2 group_id, 241 count_1, 432 count_2 from dual union all
   select 2 group_id, 321 count_1, 920 count_2 from dual union all
   select 2 group_id, 432 count_1, 121 count_2 from dual union all
   select 2 group_id, 135 count_1, 342 count_2 from dual 
)
select
  case lag (group_id) over (order by group_id, count_1) 
    when group_id then 
      case lead (group_id) over (order by group_id, count_1)
      when group_id then null
           else 'last'
      end
    else to_char(group_id) end x,
  count_1,
  count_2
from
a;

のレコードのlag(group_id) over (order by group_id, count_1)を取得します(遅れます)。同様に、次のレコードの group_id を取得します。group_idlead(group_id) over...

この式を使用して、現在の値をおよびcaseの値と比較し、適切な値を返します。 group_id

于 2013-06-13T11:33:38.857 に答える