1

私はOracle SQLを学んでおり、次のようなテーブルがあります。

+--------+--------+------------------------+
| name   | nation | count                  |
+--------+--------+------------------------+
| Ruben  | UK     | 2                      |
| Ruben  | EEUU   | 16                     |
| Cesar  | UK     | 21                     |
| Cesar  | EEUU   | 12                     |
| Cesar  | FRANCE | 4                      |
| John   | FRANCE | 3                      |
| John   | UK     | 7                      |
| ....   | ..     | ..                     |
+--------+--------+------------------------+

上の表は、クエリで作成したインライン ビューを表しています。ご覧のとおり、テーブルは名前と国でグループ化され、いくつかのカウントを行っています。カウント列を使用してテーブルをフィルタリングし、次のようにします。

+--------+--------+
| name   | nation |
+--------+--------+
| Ruben  | EEUU   |
| Cesar  | UK     |
| John   | UK     |
| ....   | ..     |
+--------+--------+  

ご覧のとおり、名前ごとに、カウントに基づいて国を選択したいと考えています。

4

2 に答える 2

3

keep分析キーワードを使用:

select name, min(nation) keep (dense_rank last order by cnt)
from (select name, nation, count(*) as cnt
      from /* your data source */
      group by name, nation)
group by name
  1. min(nation)- この場合、min は意味がありませんが、保持する必要があります (なしでは機能しません)。
  2. keep- の結果を 1 つだけ保持するnation
  3. dense_rank last最後の要素を拾うように言う
  4. order by cnt要素の順序を定義する方法を示します

最終的には、すべての名前が最大のカウントを持つ国になります。同じ結果が得られます

select name, min(nation) keep (dense_rank first order by cnt desc)
于 2014-03-05T16:43:37.880 に答える
3

これは、別のレベルの内部クエリで行うことができます。何かのようなもの:

select name, nation
from (
  select name, nation, cnt,
    row_number() over (partition by name, nation order by cnt desc) as rn
  from (
    select name, nation, count(*) as cnt
    from <your table>
  )
)
where rn = 1;

アナリティクスは、row_number()名前/国ごとに、カウントが最大の行を 1 としてランク付けする最も内側のクエリに疑似列を追加します。最も外側のクエリは、最初にランク付けされたものだけを調べます。

同順位についてどうするかを決定する必要があります。2 つの国/名前の行の数が同じ場合は、rank()代わりにrow_number();を使用して両方を表示できます。order byまたは、句に別の列を追加して、どちらを選択するかを決定できます。現時点では、同じものが 2 つある場合、そのうちの 1 つだけが表示されます。どちらが表示されるかはかなり任意です。

于 2014-03-05T15:01:39.233 に答える