0

次のテーブルとデータがすべてあります。loc1とloc2を1つの列にマージし、loc列から重複する値を削除してから、group_valの昇順に基づいて並べ替えてgroup_no列に従ってグループ化します。

drop table test;
create table test (loc1 number(9), loc2 number(9), group_no number(9),group_val number(9));
insert into test values(2,3,1,90);
insert into test values(2,9,1,10);
insert into test values(4,3,1,70);
insert into test values(6,8,2,20);
insert into test values(11,7,2,80);
insert into test values(20,15,2,70);
insert into test values(15,14,2,30);
insert into test values(21,31,3,50);
insert into test values(31,32,3,40);

期待される結果は次のとおりです。

loc   group_no   
2        1            
3        1            
4        1            
9        1             
11       2
7        2 
20       2
15       2 
6        2
8        2
21       3
31       3
32       3

Grishからのこのコードですが、group_valがないので、今すぐ追加します

select t.loc, max(t.group_no)
(
    select loc1 as loc, group_no from test

    union

    select loc2 as loc, group_no from test
) t
group by t.loc
order by 2,1


if can do it using dense_rank() over partition by group_val.

loc列は上から下にソートされます。group_val列に準拠

regards
4

4 に答える 4

1

結果として何が欲しいかは完全には明らかではありません。もしかしてこれ?:

select loc, group_no 
from
(
    select loc1 as loc, group_no, group_val 
    from test

    union all

    select loc2 as loc, group_no, group_val
    from test
) t
group by group_no, loc
order by group_no asc, max(group_val) desc, loc asc ;
于 2012-12-06T08:26:15.977 に答える
0

あなたは次のような何かを試すことができます:

クエリ:

select distinct a.loc, a.group_no
from
(select distinct loc1 as loc, group_no
  from test
union all
select distinct loc2, group_no
  from test) as a
order by a.loc asc
;

結果:

LOC    GROUP_NO
2      1
3      1
4      1
6      2
7      2
8      2
9      1
11     2
14     2
15     2
20     2
21     3
31     3
32     3
于 2012-12-06T08:28:06.477 に答える
0

要件に競合が含まれているため、要件を満たすことができません。最初の2行を見ると、次のデータの結果がわかります(loc2を使用しない場合)。

loc | group_no | group_val
  2 |        1 |        90
  2 |        1 |        10

要件に応じて、これらは重複しているため、1行に減らす必要があります。しかし、それでは、group_val並べ替えにどの値を使用しますか:90または10?

常に最小のものgroup_valを並べ替えに使用する場合は、次のクエリが機能するはずです。

select t.loc, t.group_no from
(
    select loc1 as loc, group_no, group_val from test
    union
    select loc2 as loc, group_no, group_val from test
) t
group by t.loc, t.group_no
order by group_no, min(group_val);
于 2012-12-06T08:32:29.577 に答える
0
select loc1, group_no 
from
 (
  select loc1, group_no, group_val from test
  UNION
  select loc2, group_no, group_val from test
 )
group by group_no , loc1
order by group_no, max(group_val), loc1

働くsqlfiddle

編集:
Codoが述べたように、データに競合があるため、要件を正確にする必要があります

于 2012-12-06T08:26:23.907 に答える