誰かがpartition by
キーワードが何をするのかを説明し、実際のキーワードの簡単な例と、なぜそれを使いたいのかを教えてもらえますか?他の誰かが作成したSQLクエリがあり、それが何をするのか理解しようとしています。
次によるパーティションの例:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
オンラインで見た例は少々深すぎるようです。
誰かがpartition by
キーワードが何をするのかを説明し、実際のキーワードの簡単な例と、なぜそれを使いたいのかを教えてもらえますか?他の誰かが作成したSQLクエリがあり、それが何をするのか理解しようとしています。
次によるパーティションの例:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
オンラインで見た例は少々深すぎるようです。
回答:
PARTITION BY
句は、内の各「グループ」のために使用されるレコードの範囲設定OVER
句。
SQLの例でDEPT_COUNT
は、すべての従業員レコードについて、その部門内の従業員数を返します。(emp
テーブルを正規化していないかのように、emp
テーブル内のすべてのレコードが返されます。)
emp_no dept_no DEPT_COUNT
1 10 3
2 10 3
3 10 3 <- three because there are three "dept_no = 10" records
4 20 2
5 20 2 <- two because there are two "dept_no = 20" records
別の列(例:)があった場合state
、その州にある部門の数を数えることができます。
これは、結果得るようなものであるGROUP BY
(SUM
、AVG
(すなわち、一致するレコードを削除)結果セットを集約せずに、など)。
LAST OVER
またはMIN OVER
関数を使用して、たとえば部門の最低給与と最高給与を取得し、それを副選択なしでこのレコード給与に対する計算で使用すると、はるかに高速になります。
詳細については、リンクされているAskTomの記事を参照してください。
last over
とmin over
。私は副選択が遅くなると思いますが、答えの英語の文法はそれを示唆していません。
概念は、受け入れられた回答で非常によく説明されていますが、見られる例が多ければ多いほど、よく理解できるようになります。増分例は次のとおりです。
1)ボスは「ブランド別にグループ化された在庫のあるアイテムの数を取得してください」と言います
あなたは言う:「問題ない」
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
結果:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2)上司は、「今、すべてのアイテムのリストと、そのブランドと、それぞれのブランドが持っているアイテムの数を取得してください」と言います。
あなたは試すことができます:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
しかし、あなたは得る:
ORA-00979: not a GROUP BY expression
これがOVER (PARTITION BY BRAND)
出てくるところです:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
Whicとは:
COUNT(ITEM_ID)
-アイテムの数を取得するOVER
-行のセットの上(PARTITION BY BRAND)
-同じブランドのものそして結果は:
+--------------+---------------+----------+
| Items | Brand | Count() |
+--------------+---------------+----------+
| Item 1 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 2 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 3 | No brand | 22 |
+--------------+---------------+----------+
| Item 4 | No brand | 22 |
+--------------+---------------+----------+
| Item 5 | H&M | 50 |
+--------------+---------------+----------+
等...
EMPNO DEPTNO DEPT_COUNT
7839 10 4
5555 10 4
7934 10 4
7782 10 4 --- 4 records in table for dept 10
7902 20 4
7566 20 4
7876 20 4
7369 20 4 --- 4 records in table for dept 20
7900 30 6
7844 30 6
7654 30 6
7521 30 6
7499 30 6
7698 30 6 --- 6 records in table for dept 30
ここでは、それぞれのdeptnoの数を取得しています。deptno 10については、テーブルempに4つのレコードがあり、deptno 20および30についても同様の結果が得られます。
over partitionキーワードは、client_idの作成によってデータをパーティション化しているように、各クライアントIDのサブセットを作成します。
select client_id, operation_date,
row_number() count(*) over (partition by client_id order by client_id ) as operationctrbyclient
from client_operations e
order by e.client_id;
このクエリは、client_idによって実行された操作の数を返します
この例は、パーティショニングがどのように機能し、group byがどのように機能するかについて、わずかなニュアンスを示唆していると思います。私の例がたまたまコンパイルバグである場合、私の例はOracle 12からのものです。
私は試した :
SELECT t.data_key
, SUM ( CASE when t.state = 'A' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_a_rows
, SUM ( CASE when t.state = 'B' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_b_rows
, SUM ( CASE when t.state = 'C' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_c_rows
, COUNT (1) total_rows
from mytable t
group by t.data_key ---- This does not compile as the compiler feels that t.state isn't in the group by and doesn't recognize the aggregation I'm looking for
ただし、これは期待どおりに機能します。
SELECT distinct t.data_key
, SUM ( CASE when t.state = 'A' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_a_rows
, SUM ( CASE when t.state = 'B' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_b_rows
, SUM ( CASE when t.state = 'C' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_c_rows
, COUNT (1) total_rows
from mytable t;
外部キー「data_key」に基づいて、各状態の要素数を生成します。したがって、data_key = 'APPLE'に状態 'A'の3行、状態 'B'の2行、状態 'C'の行がある場合、 'APPLE'の対応する行は 'APPLE'、3、2になります。 、1、6。