Kategorien:

Fensterfunktionen (Allgemein)

RATIO_TO_REPORT

Gibt das Verhältnis eines Wertes innerhalb einer Gruppe zur Summe der Werte innerhalb der Gruppe zurück. Wenn der erste Ausdruck expr1 null ergibt oder die Summe von expr1 innerhalb der Gruppe den Wert 0 ergibt, gibt RATIO_TO_REPORT null zurück.

Syntax

RATIO_TO_REPORT( <expr1> ) [ OVER ( [ PARTITION BY <expr2> ] [ ORDER BY <expr3> ] ) ]
Copy

Argumente

expr1

Dies ist ein Ausdruck, der einen numerischen Datentyp ergibt (INTEGER, FLOAT, DECIMAL usw.).

expr2

Dies ist der optionale Ausdruck, nach dem partitioniert werden soll.

expr3

Dies ist der optionale Ausdruck, nach dem in jeder Partition sortiert werden soll. Beachten Sie, dass für diese Funktion die Reihenfolge innerhalb der Partition keinen Einfluss auf die Ausgabe hat.

Bei dieser Funktion wird (wie bei allen Fensterfunktionen) die Reihenfolge der gesamten Abfrageausgabe nicht von dieser ORDER BY-Klausel gesteuert.

Nutzungshinweise

  • RATIO_TO_REPORT berechnet sich wie folgt:

    Wert von Argument expr1 für die aktuelle Zeile / Summe von Argument expr1 für die Partition

  • Die ORDER BY-Unterklausel in der OVER()-Klausel ist bei dieser Funktion aus Gründen der syntaktischen Konsistenz mit anderen Fensterfunktionen zulässig, das ORDER BY hat jedoch keine Auswirkungen auf die Berechnung. Snowflake empfiehlt, bei Verwendung dieser Funktion keine ORDER BY-Unterklausel in die OVER-Klausel aufzunehmen.

Beispiele

Das folgende einfache Beispiel zeigt den Prozentsatz des Gewinns einer Geschäftskette, der von jedem einzelnen Geschäft generiert wurde:

CREATE TABLE store_profit (
    store_ID INTEGER, 
    province VARCHAR,
    profit NUMERIC(11, 2));
INSERT INTO store_profit (store_ID, province, profit) VALUES
    (1, 'Ontario', 300),
    (2, 'Saskatchewan', 250),
    (3, 'Ontario', 450),
    (4, 'Ontario', NULL)  -- hasn't opened yet, so no profit yet.
    ;
Copy
SELECT 
        store_ID, profit, 
        100 * RATIO_TO_REPORT(profit) OVER () AS percent_profit
    FROM store_profit
    ORDER BY store_ID;
+----------+--------+----------------+
| STORE_ID | PROFIT | PERCENT_PROFIT |
|----------+--------+----------------|
|        1 | 300.00 |    30.00000000 |
|        2 | 250.00 |    25.00000000 |
|        3 | 450.00 |    45.00000000 |
|        4 |   NULL |           NULL |
+----------+--------+----------------+
Copy

Das folgende Beispiel zeigt den Prozentsatz des Gewinns in jedem Gebiet, der von jedem Geschäft in diesem Gebiet generiert wurde:

SELECT 
        province, store_ID, profit, 
        100 * RATIO_TO_REPORT(profit) OVER (PARTITION BY province) AS percent_profit
    FROM store_profit
    ORDER BY province, store_ID;
+--------------+----------+--------+----------------+
| PROVINCE     | STORE_ID | PROFIT | PERCENT_PROFIT |
|--------------+----------+--------+----------------|
| Ontario      |        1 | 300.00 |    40.00000000 |
| Ontario      |        3 | 450.00 |    60.00000000 |
| Ontario      |        4 |   NULL |           NULL |
| Saskatchewan |        2 | 250.00 |   100.00000000 |
+--------------+----------+--------+----------------+
Copy