Zuweisung und Kennzahlen von A/B-Tests
Experimentzuweisungen mit Ergebnissen verknüpfen und Kennzahlen pro Variante berechnen.
Zuweisung und Kennzahlen von A/B-Tests ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was eine A/B-Test-Frage prüft
A/B-Test-Fragen prüfen, ob Sie die Experimentzuweisung korrekt mit den Ergebnissen verknüpfen und eine saubere Metrik pro Variante berechnen können.
Die Falle liegt fast immer in der Verknüpfung: Sie zählen Ergebnisse für Nutzer, die nie am Experiment teilgenommen haben, oder zählen Nutzer doppelt, die zweimal zugewiesen wurden. Wenn die Verknüpfung mit der Zuweisung stimmt, sind die Metriken einfache Arithmetik.
Die beiden Tabellen, die Sie erhalten
Erwarten Sie eine Tabelle mit Zuweisungen und eine Tabelle mit Ergebnissen:
assignments(user_id, variant, assigned_at), wobei variant 'control' oder 'treatment' ist.orders(user_id, order_id, amount, created_at)oder eine allgemeine Ereignistabelle.
Die Zuweisung ist die maßgebliche Quelle dafür, wer am Experiment teilnimmt. Ergebnisse zählen nur, wenn der Nutzer in assignments vorkommt.
CREATE TABLE assignments (
user_id INT,
variant VARCHAR(20),
assigned_at TIMESTAMP
);
CREATE TABLE orders (
user_id INT,
order_id INT,
amount NUMERIC,
created_at TIMESTAMP
);Mit der Zuweisung beginnen, Ergebnisse per LEFT JOIN verknüpfen
Die Grundregel: Gehen Sie von der Zuweisungstabelle aus und verknüpfen Sie Ergebnisse per LEFT JOIN. Dadurch bleiben Nutzer erhalten, die am Experiment teilgenommen, aber nie konvertiert haben – sie werden für einen korrekten Nenner benötigt.
Ein INNER JOIN würde Nutzer ohne Conversion stillschweigend entfernen und Ihre Conversion-Rate künstlich erhöhen.
SELECT
a.user_id,
a.variant,
o.order_id
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id;Conversion pro Variante zählen
Conversion-Rate = konvertierte Nutzer / zugewiesene Nutzer, pro Variante. Zählen Sie im Zähler eindeutige Nutzer mit Conversion und im Nenner alle zugewiesenen Nutzer.
Verwenden Sie COUNT(DISTINCT ...) für den Nutzer der Bestellung, damit ein Nutzer mit drei Bestellungen trotzdem nur als ein konvertierter Nutzer zählt.
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters,
ROUND(100.0 * COUNT(DISTINCT o.user_id)
/ COUNT(DISTINCT a.user_id), 2) AS conv_rate_pct
FROM assignments a
LEFT JOIN orders o ON o.user_id = a.user_id
GROUP BY a.variant;Die Falle der doppelten Zuweisung
Was passiert, wenn ein Nutzer zweimal in assignments vorkommt, einmal in jeder Variante? Ihre Verknüpfung zählt ihn nun auf beiden Seiten, und das Experiment ist verfälscht.
Das wird in Interviews gern eingebaut. Sichern Sie sich dagegen ab: Deduplizieren Sie die Zuweisungen vor der Verknüpfung auf eine Variante pro Nutzer, typischerweise auf die erste Zuweisung.
WITH dedup AS (
SELECT user_id, variant,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
FROM assignments
)
SELECT user_id, variant
FROM dedup
WHERE rn = 1;Ergebnisse erst nach der Zuweisung zählen
Eine Bestellung, die vor der Zuweisung des Nutzers aufgegeben wurde, kann nicht durch das Experiment verursacht worden sein. Fügen Sie eine Zeitbedingung hinzu: Das Ergebnis muss zum Zeitpunkt assigned_at oder danach eintreten.
Platzieren Sie diese Bedingung in der ON-Klausel des LEFT JOIN, damit Nutzer ohne Conversion weiterhin berücksichtigt werden.
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant;ON oder WHERE bei der Ergebnisverknüpfung
Das ist eine typische Anschlussfrage. Wenn Sie o.created_at >= a.assigned_at in WHERE verschieben, machen Sie aus dem LEFT JOIN einen INNER JOIN: Für Zeilen, in denen der Nutzer nie eine Bestellung aufgegeben hat, gilt o.created_at = NULL, das Prädikat ist UNKNOWN, und die Zeilen verschwinden.
Behalten Sie Bedingungen zur Filterung von Ergebnissen in ON, damit Nutzer ohne Conversion im Nenner erhalten bleiben.
Umsatzmetriken pro Variante
Über die Conversion hinaus fragen Interviewer nach Umsatz pro Nutzer (ARPU) und Umsatz pro konvertiertem Nutzer. Summieren Sie den Betrag und teilen Sie anschließend durch den richtigen Nenner.
ARPU wird durch alle zugewiesenen Nutzer geteilt; der Umsatz pro konvertiertem Nutzer nur durch Nutzer, die eine Bestellung aufgegeben haben. Machen Sie ausdrücklich klar, welche Kennzahl das Unternehmen benötigt.
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COALESCE(SUM(o.amount), 0) AS revenue,
ROUND(COALESCE(SUM(o.amount), 0)
/ COUNT(DISTINCT a.user_id), 2) AS arpu
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant;Aggregationsmuster mit zwei Ebenen
Wenn eine Metrik "durchschnittliche Anzahl von Bestellungen pro Nutzer" lautet, berechnen Sie sie nicht in einem Durchgang; dabei würden Sie die Nutzer- und die Bestellebene vermischen. Aggregieren Sie zunächst auf der Nutzerebene und bilden Sie dann den Durchschnitt über die Nutzer.
Dieses Muster – zuerst pro Nutzer, dann pro Variante – verwendet die richtige Granularität und ist ein häufiger Unterscheidungspunkt in Interviews.
WITH per_user AS (
SELECT a.variant, a.user_id,
COUNT(o.order_id) AS orders_cnt
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant, a.user_id
)
SELECT variant, ROUND(AVG(orders_cnt), 3) AS avg_orders_per_user
FROM per_user
GROUP BY variant;Vollständige, belastbare Abfrage
Führen Sie alles zusammen: Deduplizieren Sie auf die erste Zuweisung, gehen Sie von der Zuweisung aus, sichern Sie Ergebnisse zeitlich in ON ab und geben Sie Conversion sowie ARPU pro Variante aus. Erläutern Sie jede Bedingung, während Sie sie schreiben.
WITH enrolled AS (
SELECT user_id, variant, assigned_at
FROM (
SELECT user_id, variant, assigned_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
FROM assignments
) x WHERE rn = 1
)
SELECT
e.variant,
COUNT(DISTINCT e.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters,
ROUND(100.0 * COUNT(DISTINCT o.user_id)
/ COUNT(DISTINCT e.user_id), 2) AS conv_pct,
ROUND(COALESCE(SUM(o.amount),0)
/ COUNT(DISTINCT e.user_id), 2) AS arpu
FROM enrolled e
LEFT JOIN orders o
ON o.user_id = e.user_id
AND o.created_at >= e.assigned_at
GROUP BY e.variant;Plausibilitätsprüfungen, die Interviewer erwarten
Prüfen Sie vor der Präsentation der Ergebnisse die Einrichtung des Experiments:
- Sind die Größen der Varianten ungefähr ausgeglichen? Eine Aufteilung von 90/10, wenn 50/50 vorgesehen war, deutet auf einen Fehler hin.
- Ist ein Nutzer in beiden Varianten gelandet? Zählen Sie Nutzer mit mehr als einer unterschiedlichen Variante.
- Gibt es Zuweisungen ohne mögliches Ergebnisfenster, weil sie nach dem Datenstichtag erfolgt sind?
Wenn Sie diese Prüfungen ungefragt anbieten, zeigt das analytische Reife.
SELECT user_id, COUNT(DISTINCT variant) AS variant_count
FROM assignments
GROUP BY user_id
HAVING COUNT(DISTINCT variant) > 1;Schnelltest
Sie berechnen die Conversion pro Variante, indem Sie orders per LEFT JOIN mit assignments verknüpfen, setzen o.created_at >= a.assigned_at aber in die WHERE-Klausel. Was passiert?
Zusammenfassung: A/B-Test-Zuweisung und Metriken
Sie verfügen nun über einen belastbaren Leitfaden zur Experimentanalyse:
- Behandeln Sie die Zuweisung als maßgebliche Quelle und verknüpfen Sie Ergebnisse per LEFT JOIN.
- Deduplizieren Sie auf eine Variante pro Nutzer (erste Zuweisung).
- Sichern Sie Ergebnisse zeitlich in der ON-Klausel ab, niemals in WHERE, damit Nutzer ohne Conversion erhalten bleiben.
- Wählen Sie den richtigen Nenner für Conversion, ARPU und Umsatz pro konvertiertem Nutzer.
- Aggregieren Sie für Durchschnittswerte pro Nutzer zuerst auf der Nutzerebene.
- Führen Sie Plausibilitätsprüfungen zur Ausgewogenheit der Aufteilung und zu Zuweisungen in mehrere Varianten durch.
Als Nächstes: Wie Sie diese Metriken pro Variante in Lift, Signifikanz und Guardrails umwandeln.
Häufig gestellte Fragen
Ist die Lektion „Zuweisung und Kennzahlen von A/B-Tests“ kostenlos?
Ja — der vollständige Text von „Zuweisung und Kennzahlen von A/B-Tests“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Zuweisung und Kennzahlen von A/B-Tests“?
Experimentzuweisungen mit Ergebnissen verknüpfen und Kennzahlen pro Variante berechnen. Du übst SQL Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. SQL Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Zuweisung und Kennzahlen von A/B-Tests“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede SQL Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Einen mehrstufigen Funnel erstellen
- Geordnete Ereignisse und Zeitfenster
- Zuweisung und Kennzahlen von A/B-Tests
- Lift, Signifikanz und Schutzprüfungen in SQL