0

私はテーブルXYZを持っています

+ ------ + ------ + ------ + ----- +
| X1 | x2 | x3 | x4 |
+ ------ + ------ + ------ + ----- +
| a | b | c | 1 |
| a | b | d | 2 |
| p | q | e | 3 |
| p | q | f | 4 |
+ ------ + ------ + ------ + ----- +

条件は、x1とx2が一致する場合、行のx3とx4を取得します。このテーブルをクエリすると、x4が最大になります。

+ ------ + ------ + ------ + ----- +
| X1 | x2 | x3 | x4 |
+ ------ + ------ + ------ + ----- +
| a | b | d | 2 |
| p | q | f | 4 |
+ ------ + ------ + ------ + ----- +

select * from XYZ t1、(select x1、x2、max(x4)from XYZ)t2として試してみました。ここで、t1.x1=t2.x1およびt1.x2=t2.x2

しかし、これは大規模なデータベースでは非常に遅いため、ランクや分割などの高度な関数を使用したいと思います

4

1 に答える 1

0

x4が等しい場合に複数の行を返すかどうかに応じて、rankまたはrow_numberを使用できます。

例えば:

SQL> select *
  2    from (select x1, x2, x3, x4, rank() over (partition by x1, x2 order by x4 desc) rnk
  3            from xyz)
  4   where rnk = 1;

X X X         X4        RNK
- - - ---------- ----------
a b d          2          1
p q f          4          1

ただし、a、bの場合、x4 = 2に2つの行がある場合、2つの行が返されます。

SQL> insert into xyz values ('a', 'b', 'd', 2);

1 row created.

SQL> select *
  2    from (select x1, x2, x3, x4, rank() over (partition by x1, x2 order by x4 desc) rnk
  3            from xyz)
  4   where rnk = 1;

X X X         X4        RNK
- - - ---------- ----------
a b d          2          1
a b d          2          1
p q f          4          1

1つだけが必要な場合は、row_number()代わりに次を使用してください。

SQL> select *
  2    from (select x1, x2, x3, x4, row_number() over (partition by x1, x2 order by x4 desc) rn
  3            from xyz)
  4   where rn = 1;

X X X         X4         RN
- - - ---------- ----------
a b d          2          1
p q f          4          1

SQL>
于 2013-01-10T09:52:22.893 に答える