Code & Queries

Code & Queries: Your Source for SQL, Python, and AI Insights

Um ein Trennkriterium für "Obere" und "Untere" in einem Ranking in DuckDB SQL zu erstellen, können wir eine Kombination aus Fensterfunktionen und bedingter Logik verwenden. Das Ziel ist es, die Daten in zwei Gruppen zu unterteilen: die obere Hälfte und die untere Hälfte des Rankings.

Beispiel:

Angenommen, wir haben eine Tabelle sales mit den Spalten id, salesperson, und sales_amount. Wir möchten die Verkäufer nach ihrem Verkaufsvolumen (sales_amount) ranken und sie dann in die obere und untere Hälfte einteilen.

Schritt 1: Ranking erstellen

Zuerst erstellen wir ein Ranking basierend auf der sales_amount:

WITH ranked_sales AS (
    SELECT
        id,
        salesperson,
        sales_amount,
        RANK() OVER (ORDER BY sales_amount DESC) AS sales_rank,
        COUNT(*) OVER () AS total_salespeople
    FROM
        sales
)

Schritt 2: Trennkriterium anwenden

Nun teilen wir die Verkäufer in die obere und untere Hälfte ein. Wir verwenden dazu die sales_rank und total_salespeople:

SELECT
    id,
    salesperson,
    sales_amount,
    sales_rank,
    CASE
        WHEN sales_rank <= total_salespeople / 2 THEN 'Obere Hälfte'
        ELSE 'Untere Hälfte'
    END AS ranking_group
FROM
    ranked_sales
ORDER BY
    sales_rank;

Vollständiges Beispiel:

-- Tabelle erstellen und Daten einfügen
CREATE TABLE sales (
    id INT,
    salesperson VARCHAR,
    sales_amount DECIMAL(10, 2)
);

INSERT INTO sales (id, salesperson, sales_amount) VALUES
(1, 'Alice', 1500.00),
(2, 'Bob', 2000.00),
(3, 'Charlie', 1200.00),
(4, 'David', 1800.00),
(5, 'Eve', 2200.00),
(6, 'Frank', 1300.00),
(7, 'Grace', 1700.00),
(8, 'Hank', 1900.00),
(9, 'Ivy', 2100.00),
(10, 'Jack', 1400.00);

-- Ranking und Trennung in obere/untere Hälfte
WITH ranked_sales AS (
    SELECT
        id,
        salesperson,
        sales_amount,
        RANK() OVER (ORDER BY sales_amount DESC) AS sales_rank,
        COUNT(*) OVER () AS total_salespeople
    FROM
        sales
)
SELECT
    id,
    salesperson,
    sales_amount,
    sales_rank,
    CASE
        WHEN sales_rank <= total_salespeople / 2 THEN 'Obere Hälfte'
        ELSE 'Untere Hälfte'
    END AS ranking_group
FROM
    ranked_sales
ORDER BY
    sales_rank;

Erklärung:

  1. RANK() OVER (ORDER BY sales_amount DESC): Diese Funktion weist jedem Verkäufer einen Rang basierend auf der sales_amount zu. Der Verkäufer mit dem höchsten Verkaufsvolumen erhält den Rang 1.

  2. COUNT(*) OVER (): Diese Funktion zählt die Gesamtanzahl der Verkäufer in der Tabelle.

  3. CASE-Statement: Hier wird entschieden, ob ein Verkäufer zur oberen oder unteren Hälfte gehört. Wenn der Rang eines Verkäufers kleiner oder gleich der Hälfte der Gesamtanzahl der Verkäufer ist, wird er der "Oberen Hälfte" zugeordnet, andernfalls der "Unteren Hälfte".

Ergebnis:

Das Ergebnis dieser Abfrage wird eine Liste der Verkäufer sein, die nach ihrem Verkaufsvolumen geordnet ist, zusammen mit einer Spalte ranking_group, die angibt, ob sie zur oberen oder unteren Hälfte gehören.

 id | salesperson | sales_amount | sales_rank | ranking_group
----+-------------+--------------+------------+---------------
  5 | Eve         |      2200.00 |          1 | Obere Hälfte
  9 | Ivy         |      2100.00 |          2 | Obere Hälfte
  2 | Bob         |      2000.00 |          3 | Obere Hälfte
  8 | Hank        |      1900.00 |          4 | Obere Hälfte
  4 | David       |      1800.00 |          5 | Obere Hälfte
  7 | Grace       |      1700.00 |          6 | Untere Hälfte
  1 | Alice       |      1500.00 |          7 | Untere Hälfte
 10 | Jack        |      1400.00 |          8 | Untere Hälfte
  6 | Frank       |      1300.00 |          9 | Untere Hälfte
  3 | Charlie     |      1200.00 |         10 | Untere Hälfte

In diesem Beispiel gehören die ersten 5 Verkäufer zur "Oberen Hälfte" und die restlichen 5 zur "Unteren Hälfte".