Zurück zur Artikelliste Artikel
11 Leseminuten

Amazon SQL-Interview-Fragen

Bereiten Sie sich auf ein Vorstellungsgespräch bei Amazon vor? Werfen Sie einen Blick auf diese Fragen und testen Sie Ihr professionelles SQL-Wissen!

Die Vorbereitung auf ein Vorstellungsgespräch bei einem großen Unternehmen wie Amazon kann überwältigend sein, aber Sie können im Vorfeld immer üben und Ihre SQL-Kenntnisse stärken! In diesem Artikel gehen wir auf die SQL-Interviewfragen von Amazon ein und helfen Ihnen, sich auf Ihr nächstes großes Interview vorzubereiten. Möchten Sie SQL vollständig beherrschen und jede Aufgabe meistern? Unser kompletter SQL von A bis Z Track, in dem wir jeden Winkel von SQL mit mehr als 850 Übungen abdecken, wird Ihnen helfen, Ihr Ziel zu erreichen.

Wenn Sie auf der Suche nach weiteren SQL-Fragen für Vorstellungsgespräche sind, sollten Sie sich unseren Artikel Top 100+ SQL-Interview-Fragen und -Übungen ansehen. Darin haben wir viele weitere SQL-Übungen zusammengestellt, mit denen Sie sich auf Ihr nächstes Vorstellungsgespräch vorbereiten können.

Wie läuft ein Amazon SQL-Vorstellungsgespräch ab?

Sie können sich auf eine Stelle bei Amazon unter amazon.jobs bewerben und die Suchfunktion nutzen , um alle Stellen zu finden, die mit SQL zu tun haben. Sie können auch nach verwandten Stichworten wie "Datenbank", "Data Science" oder "Analyst" suchen, um ähnliche Stellen zu finden.

Wenn Ihre Bewerbung erfolgreich ist und Sie einen aussagekräftigen Lebenslauf vorlegen können, wird sich ein Personalverantwortlicher mit Ihnen in Verbindung setzen und ein kurzes Telefonat führen. Bei diesem ersten Gespräch geht es höchstwahrscheinlich nicht um technische Fragen, sondern darum, festzustellen, ob Sie gut zur Unternehmenskultur passen. Sobald Sie diese Prüfung bestanden haben, beginnt das technische Gespräch.

Die technischen Interviewer von Amazon werden Ihnen Fragen zu SQL und Daten sowie andere Fragen stellen, die sich auf die Stelle beziehen, für die Sie sich beworben haben. Die SQL-Interviews bei Amazon sind dafür bekannt, dass sie zunächst die Grundlagen der Syntax abdecken und dann tief in komplexe JOINs und Fensterfunktionen eintauchen. Sie können diese Themen mit unserem SQL-JOINs Kurs und unserem umfangreichen Window Functions Kurs üben.

In diesem Artikel werden wir uns auf das Üben von JOINs und Fensterfunktionen konzentrieren. Wenn Sie Ihr Wissen über die Grundlagen von SQL auffrischen möchten, sehen Sie sich unsere Liste der häufigsten SQL-Interview-Fragen an.

Lernen Sie die Daten kennen

Für diesen Übungssatz werden wir zwei einfache Tabellen verwenden, salesperson und product. Schauen wir uns jede von ihnen an.

Die Tabelle salesperson speichert Informationen über alle Außendienstmitarbeiter des Unternehmens. Jeder wird mit einer id (gespeichert als INT-Datentyp) identifiziert und hat eine name (TEXT), eine salary (NUMERIC) und eine optionale manager_id (INT). Wenn sie vorhanden ist, verweist die Manager-ID auf die id eines anderen Verkäufers, der den aktuellen Verkäufer beaufsichtigt.

Die Tabelle product Tabelle speichert Informationen über die von den Verkäufern verkauften Produkte. Jedes Produkt wird durch seine id (INT) identifiziert und hat ein name (TEXT), price (NUMERIC), category (TEXT) und ein obligatorisches salesperson_id (INT). Das letzte Feld verweist auf die ID des Vertreters, der das Produkt verkauft.

Nachdem wir uns nun die Daten angesehen haben, können wir mit den Übungen beginnen. Unsere kostenlosen SQL-Spickzettel könnten eine gute Idee sein. Unser SQL-JOINs Cheat Sheet und Fensterfunktionen Cheat Sheet helfen Ihnen, wenn Sie eine schnelle Erinnerung an die Syntax eines Befehls benötigen.

Amazon SQL Interview Fragen, Antworten und Erklärungen

1. hochverdienende Vertriebsmitarbeiter

Aufgabe: Finden Sie alle Vertriebsmitarbeiter, deren Gehalt höher ist als das ihrer Vorgesetzten.

Antwort:

SELECT e1.name
FROM salesperson e1
JOIN salesperson e2
  ON e1.manager_id = e2.id
  AND e2.salary < e1.salary;

Erläuterung:

Um jeden Verkäufer mit seinem Manager zu verknüpfen, müssen wir einen Self-Join verwenden - d.h. wir müssen die Tabelle mit sich selbst verknüpfen. Für einen Vertriebsmitarbeiter, der einen Manager hat, ergibt die Verknüpfung mit der Bedingung salesperson1.id = salesperson2.manager_id Paare von Vertriebsmitarbeitern und ihren Managern. Eine LEFT JOIN ist hier nicht erforderlich, da wir speziell nur nach Verkäufern suchen, die einen Manager haben.

Sie können die Filterbedingung (manager.salary < salesperson.salary) entweder in einer WHERE -Klausel oder als zusätzliche Bedingung in der JOIN -Klausel einfügen (und so einen Non-Equi Join erstellen). Eine nicht-gleiche Verknüpfung kann eine gute Demonstration Ihrer JOIN-Fähigkeiten sein, aber das Ergebnis ist hier das gleiche.

Wenn Sie für Ihr nächstes Vorstellungsgespräch mehr JOIN-Übungen benötigen, schauen Sie sich unseren Kurs SQL-JOINs an, der Sie durch alle JOIN-Typen führt und Ihnen zeigt, wie Sie sie am besten einsetzen.

2. teurere Produkte

Aufgabe: Zählen Sie für jedes Produkt die Anzahl der Produkte, die teurer sind als das Produkt.

Die Antwort:

SELECT
  p1.name,
  COUNT(p2.name) AS num_products
FROM product p1
LEFT JOIN product p2
  ON p1.price < p2.price
GROUP BY p1.name;

Erläuterung:

Diese Aufgabe lässt sich entweder mit einem Self-Join oder einer Subquery leicht lösen. Da Amazon-Interviews dazu neigen, komplizierte JOINs zu verwenden (und weil JOIN-Abfragen tendenziell schneller laufen als Subqueries), werden wir einen weiteren Self-Join verwenden.

Um die Filterung nach der Verknüpfung zu überspringen, fügen wir die Bedingung product1.price < product2.price in die Verknüpfung selbst, innerhalb der ON-Klausel, ein. Eine LEFT JOIN sorgt dafür, dass das teuerste Produkt einbezogen wird. Das teuerste Produkt hat keine entsprechenden Produkte, mit denen es verknüpft werden kann, so dass es bei einem regulären JOIN ausgeschlossen wäre.

3 Produkte über dem Gehalt eines Vertreters

Aufgabe: Zeige für jeden Verkäufer, wie viele Produkte er verkauft, deren Preis höher ist als sein Gehalt. Schließe alle Verkäufer in das Ergebnis ein, auch wenn sie keine solchen Produkte verkaufen.

Die Antwort:

SELECT
  s.id,
  s.name,
  s.salary,
  s.manager_id,
  COUNT(p.name) AS expensive_products
FROM salesperson s
LEFT JOIN product p
  ON s.id = p.salesperson_id
  AND p.price > s.salary
GROUP BY
  s.id,
  s.name,
  s.salary,
  s.manager_id;

Erläutern Sie:

Verbinden Sie product und salesperson. Um nur die Produkte zu zählen, die mehr kosten als das Gehalt des Vertreters, verwenden Sie die Filterbedingung p.price > s.salary. Sie könnten diese Bedingung in die WHERE Klausel nach der JOIN Klausel einfügen, aber die meisten Vertreter haben keine so teuren Produkte, und die Filterbedingung wird alle diese Produkte ausschließen. Fügen Sie diese Bedingung stattdessen als zusätzliche Bedingung bei der Verknüpfung der beiden Tabellen ein und verwenden Sie eine LEFT JOIN.

Wenn ein Verkäufer keine Produkte hat, die mehr als sein Gehalt kosten, wird er trotzdem im Endergebnis durch die LEFT JOIN beibehalten. Seine expensive_products Anzahl wird den Wert 0 haben.

Wenn Sie mehr darüber erfahren möchten, wann Sie nicht-gleiche JOINs verwenden sollten, sehen Sie sich diese detaillierten nicht-gleichen JOIN-Beispiele an.

4: Produktpreis nach Kategorie

Aufgabe: Finde für jedes Produkt heraus, wie sein Preis im Vergleich zum Durchschnittspreis der anderen Produkte in der Kategorie ist. Zeigen Sie den Namen und den Preis des Produkts zusammen mit dem Durchschnittspreis aller anderen Produkte in derselben Kategorie.

Die Antwort:

SELECT
  p1.name,
  p1.price,
  AVG(p2.price) AS avg_price_in_category
FROM product p1
JOIN product p2
  ON p1.category = p2.category
  AND p1.id != p2.id
GROUP BY
  p1.name,
  p1.price;

Erläuterung:

Um den Durchschnittspreis aller anderen Produkte in derselben Kategorie zu berechnen, müssen Sie Paare wie das folgende bilden: Produkt - ein anderes Produkt derselben Kategorie. Dazu verknüpfen Sie die Produkttabelle mit der Kategorie des Produkts. Dies schließt Zeilen ein, in denen das Produkt mit sich selbst verknüpft ist, so dass eine zusätzliche Bedingung in JOIN: product1.name != product2.name hinzugefügt werden muss. (Diese könnte auch in der WHERE-Klausel stehen.)

Jetzt, da alle Produktpaare vollständig sind, können wir den Durchschnittspreis des zweiten Produkts im Paar herausrechnen und nach dem ersten Produkt gruppieren. So erhalten wir das gewünschte Ergebnis.

5. durchschnittliches Gehalt des Verkäufers

Aufgabe: Zeigen Sie alle Daten der Vertriebsmitarbeiter sowie eine Spalte mit dem Durchschnittsgehalt aller Vertriebsmitarbeiter und die Differenz zwischen dem salary dieses Vertriebsmitarbeiters und dem average_salary für alle Vertriebsmitarbeiter.

Die Antwort:

SELECT 
  id,
  name,
  salary,
  manager_id,
  AVG(salary) OVER() AS average_salary,
  salary - AVG(salary) OVER() AS salary_difference
FROM salesperson;

Erläuterung:

Um das Durchschnittsgehalt für alle Verkäufer zu ermitteln, verwenden wir die Fensterfunktion AVG(). Sie funktioniert auf die gleiche Weise wie die Aggregatfunktion AVG(), aber um sie zu einer Fensterfunktion zu machen, verwenden wir OVER() statt GROUP BY.

Verwenden Sie eine leere OVER() Klausel, um den Durchschnittswert des Gehalts für alle Verkäufer zu ermitteln. Benennen Sie die Spalte der Übersichtlichkeit halber average_salary. Subtrahieren Sie das Gehalt jedes Vertreters (das für jede Zeile unterschiedlich ist) von average_salary (das für jede Zeile gleich ist), um die Gehaltsdifferenz für jeden Vertreter zu erhalten. Nennen Sie dies salary_difference.

Wenn Sie noch mehr Fensterfunktionen üben möchten, schauen Sie sich unseren Kurs Fensterfunktionen an. Er bietet über 200 interaktive Übungen, mit denen Sie die Fensterfunktionen im Detail kennen lernen können!

6. Relative Produktpreise

Aufgabe: Geben Sie für jedes Produkt das Verhältnis zwischen seinem Preis und dem Preis des teuersten Produkts in dieser Kategorie an.

Antwort:

SELECT
  name,
  price,
  price / MAX(price) OVER(PARTITION BY category) AS price_ratio
FROM product;

Erklären Sie:

Um das Verhältnis zwischen dem Preis des aktuellen Produkts und dem Preis des teuersten Produkts der gleichen Kategorie zu berechnen, muss man diese Formel verwenden: ratio = price / (max price from the same category).

Wir können hier nicht GROUP BY verwenden, da es die einzelnen Zeilen zusammenklappt; stattdessen verwenden wir die Fensterfunktion MAX(). Anders als in der letzten Übung geben wir hier die Partitionierung explizit an. Wir wollen ein separates Ergebnis für jede Kategorie erhalten, daher wird die Syntax wie folgt lauten: PARTITION BY category. Setzen Sie sie in die Klausel OVER(), die direkt nach der Fensterfunktion MAX() kommt.

7: Produktpreis-Ränge innerhalb der Kategorien

Aufgabe: Zeigen Sie, wie die Preise der einzelnen Produkte innerhalb ihrer Kategorie rangieren. Zeigen Sie den Namen, den Preis und die Kategorie jedes Produkts zusammen mit dem Preisrang an. Das teuerste Produkt in seiner Kategorie sollte an erster Stelle und das billigste Produkt an letzter Stelle stehen.

Antwort:

SELECT
  name,
  price,
  category,
  ROW_NUMBER() OVER(PARTITION BY category ORDER BY price DESC) AS category_rank
FROM product

Erläuterung:

Um eine Rangliste für jede Zeile innerhalb ihrer Kategorie zu erstellen, müssen wir die Funktionen des Ranglistenfensters verwenden. Hierfür gibt es mehrere Möglichkeiten: RANK(), DENSE_RANK(), oder ROW_NUMBER(). Obwohl sie in manchen Fällen unterschiedliche Ergebnisse liefern können, funktioniert in diesem Fall jede von ihnen. Mehr über die Unterschiede zwischen diesen drei Funktionen erfahren Sie in unserem Überblick über SQL-Ranking-Funktionen.

Für dieses Beispiel werden wir ROW_NUMBER() verwenden. Sie gibt die Nummer jeder Zeile innerhalb ihrer Kategorie zurück, ohne Nummern zu überspringen oder zu wiederholen, wenn Produkte den gleichen Rang haben.

Wir verwenden ROW_NUMBER() zusammen mit OVER(), um die Größe des Fensters und die Reihenfolge, in der die Zeilen sortiert werden, festzulegen. PARTITION BY category setzt das Fenster auf alle Produkte derselben Kategorie wie die aktuelle Zeile. Dadurch wird sichergestellt, dass nur Produkte derselben Kategorie für die Berechnung der Rangfolge berücksichtigt werden. Dann legt ORDER BY price DESC die Rangfolge fest (Produkte mit höheren Preisen werden höher eingestuft).

8. die bestbezahlten Vertreter des Managers

Aufgabe: Zeigen Sie unter den Vertriebsmitarbeitern, die einem Manager unterstellt sind, diejenigen an, die am meisten bezahlt werden. Mit anderen Worten: Zeige für jeden Manager mit Untergebenen den am höchsten bezahlten Untergebenen, aber nicht den Manager selbst.

Die Antwort:

WITH salesperson_with_highest_salary as (
  SELECT
    id,
    name,
    salary,
    manager_id,
    MAX(salary) OVER (PARTITION BY manager_id) AS highest_salary
  FROM salesperson
)
SELECT *
FROM salesperson_with_highest_salary
WHERE salary = highest_salary;

Erläuterung:

Zunächst erstellen wir ein Zwischenergebnis: Für jeden Verkäufer finden wir seine ID, seinen Namen, sein Gehalt, die Manager-ID und das höchste Gehalt seiner Kollegen (d. h. der Vertreter, die denselben Manager haben). Wir verwenden die Fensterfunktion MAX() zusammen mit OVER (PARTITION BY manager_id), um das höchste Gehalt pro Gruppe von Vertretern mit demselben manager_id zu finden.

Beachten Sie, dass wir die Abfrage in einen gemeinsamen Tabellenausdruck (CTE) verpacken. Ein CTE beginnt mit dem Schlüsselwort WITH und einem Namen. Dieser Name wird den Zwischenergebnissen gegeben, auf die später in der Hauptabfrage Bezug genommen werden kann.

Hier heißt die CTE salesperson_with_highest_salary. Wenn Sie eine Erinnerung an die Funktionsweise von CTEs benötigen, lesen Sie unseren Leitfaden zu allgemeinen Tabellenausdrücken in SQL. Wenn Sie einen tiefer gehenden Ansatz suchen, besuchen Sie unseren Kurs Common Table Expressions.

Wir müssen nur die Vertriebsmitarbeiter anzeigen, die in ihrer Gruppe die höchste Vergütung erhalten. Da Sie nun die salary des Vertreters zusammen mit der highest_salary der Gruppe haben, können Sie die Verkäufer in der äußeren Abfrage so filtern, dass nur diejenigen angezeigt werden, die das gleiche Gehalt wie das höchste Gehalt der Gruppe haben. Wenn zwei oder mehr Vertreter in einer Gruppe das höchste Gehalt haben, werden sie alle im Endergebnis angezeigt.

9. teuerste Produkte nach Kategorie

Aufgabe: Finde in jeder Kategorie die drei Produkte mit dem höchsten Preis. Wenn mehrere Produkte den gleichen Preis haben, schließe sie alle ein.

Die Antwort:

WITH product_ranks AS (
  SELECT
  name,
  price,
  category,
  DENSE_RANK() OVER (PARTITION BY category ORDER BY price DESC) AS rank
  FROM Product
)
SELECT * 
FROM product_ranks
WHERE rank <= 3;

Erläuterung:

Wir verwenden wieder eine Fensterfunktion innerhalb einer CTE. Diesmal müssen wir eine zusätzliche Rangliste für jede Zeile innerhalb ihrer Kategorie erstellen. Hierfür müssen wir DENSE_RANK() verwenden; sie gibt alle Produkte mit den drei höchsten Preisen zurück, auch wenn einige Produkte den gleichen Preis haben.

Verwenden Sie PARTITION BY kategorie, um ein separates Ranking innerhalb jeder Kategorie zu erhalten, und ORDER BY preis DESC, um sicherzustellen, dass die höherpreisigen Produkte die höheren Ränge erhalten. Verpacken Sie die Abfrage, die den Rang für jede Zeile ermittelt, in eine CTE, damit der Rang beim Filtern der Zeilen verfügbar ist. Jede Zeile mit dem Rang 1, 2 oder 3 gehört zu den drei besten Produkten in ihrer Kategorie; verwenden Sie dies als Filterbedingung in der äußeren Abfrage, um das Endergebnis zu erhalten.

Sind Sie bereit für Ihr Amazon SQL-Interview?

Sehr gut gemacht! Wenn Sie alle Aufgaben in unserer Vorbereitung auf das Amazon SQL-Interview erfolgreich gelöst haben, können Sie auf Ihre fortgeschrittenen SQL-Kenntnisse vertrauen. Viel Glück bei Ihrem nächsten Vorstellungsgespräch!

Sind Sie hungrig nach komplexeren SQL-Interview-Fragen zum Üben? Werfen Sie einen Blick auf diese 15 kniffligen Interviewfragen, die theoretische und praktische SQL-Themen kombinieren. Und wenn Sie auf der Suche nach einer breiteren Palette von Übungsaufgaben sind, finden Sie in unserem Fortgeschrittenes SQL Practice Track über 350. Viel Spaß beim Üben!