Als ich mich bei einem bestimmten Unternehmen für eine BI-Position bewarb, gab es im Vorstellungsgespräch eine SQL-Frage. Sie schien auf den ersten Blick sehr einfach zu sein, aber als ich sie schrieb, stellte ich fest, dass mir die Zusammenfassung fehlte und ich sie nicht schnell ausschreiben konnte. Die Themen sind wie folgt: Finden Sie die Anzahl der Aktionstage für jede Marke Der Tabellenverkauf ist eine Werbemarketingtabelle. Die Daten enthalten wiederholte Daten. Beispielsweise ist das Enddatum von ID 1 20180905 und das Startdatum von ID 2 20180903. Das heißt, ID 1 und ID 2 haben wiederholte Verkaufsdaten. Ermitteln Sie die Anzahl der Aktionstage für jede Marke (Duplikate werden nicht gezählt). Die Tabellenergebnisse lauten wie folgt: +------+----------+------------+------------+ | ID | Marke | Startdatum | Enddatum | +------+----------+------------+------------+ | 1 | nike | 01.09.2018 | 05.09.2018 | | 2 | nike | 03.09.2018 | 06.09.2018 | | 3 | nike | 09.09.2018 | 15.09.2018 | | 4 | oppo | 04.08.2018 | 05.08.2018 | | 5 | oppo | 04.08.2018 | 15.08.2018 | | 6 | vivo | 15.08.2018 | 21.08.2018 | | 7 | vivo | 02.09.2018 | 12.09.2018 | +------+----------+------------+------------+ Das Endergebnis sollte sein
Anweisung „Tabelle erstellen“ -- ---------------------------- -- Tischkonstruktion zu verkaufen -- ---------------------------- DROP TABLE, WENN `Verkauf` EXISTIERT; CREATE TABLE `Verkauf` ( `id` int(11) DEFAULT NULL, `Marke` varchar(255) DEFAULT NULL, `start_date` Datum DEFAULT NULL, `end_date` Datum STANDARD NULL )ENGINE=InnoDB STANDARD-CHARSET=utf8; -- ---------------------------- -- Verkaufsunterlagen -- ---------------------------- INSERT INTO `Verkauf` VALUES (1, 'Nike', '2018-09-01', '2018-09-05'); INSERT INTO `Verkauf` VALUES (2, 'Nike', '2018-09-03', '2018-09-06'); INSERT INTO `Verkauf` VALUES (3, 'Nike', '2018-09-09', '2018-09-15'); INSERT INTO `Verkauf` VALUES (4, 'oppo', '2018-08-04', '2018-08-05'); INSERT INTO `Verkauf` VALUES (5, 'oppo', '2018-08-04', '2018-08-15'); INSERT INTO `Verkauf` VALUES (6, 'vivo', '2018-08-15', '2018-08-21'); INSERT INTO `Verkauf` VALUES (7, 'vivo', '2018-09-02', '2018-09-12'); Methode 1: Mit der Methode der Selbstassoziation zum nächsten Datensatz wähle Marke, Summe(Enddatum-vor_Datum+1) alle Tage von ( wähle s.id, s.brand, s.start_date , s.Enddatum , if(s.start_date>=ifnull(t.end_date,s.start_date) ,s.start_date,DATE_ADD(t.end_date,Intervall 1 Tag) ) als Vordatum vom Verkauf s links verbinden (wählen Sie id+1 als ID, Marke, Enddatum vom Verkauf) t auf s.id = t.id und s.marke = t.marke Bestellung nach s.id )tmp nach Marke gruppieren Ergebnisse der Operation +----------+---------+ | Marke | ganztägig | +----------+---------+ | Nike | 13 | | Gegenteil | 12 | | 18 | +----------+---------+ Diese Methode ist für die Tabelle in dieser Frage gültig, kann aber möglicherweise nicht auf Datensätze von Marken mit diskontinuierlichen IDs angewendet werden. Methode 2: WÄHLEN Sie eine Marke, SUMME ( FALL WENN a.Startdatum=b.Startdatum UND a.Enddatum=b.Enddatum UND NICHT EXISTIERT( WÄHLEN * VON Verkauf c LINKS VERBINDEN Verkauf d AUF c.Marke=d.Marke WO d.Marke = a.Marke UND c.Startdatum=a.Startdatum UND c.id<>d.id UND (d.Startdatum ZWISCHEN c.Startdatum UND c.Enddatum UND d.Enddatum>c.Enddatum ODER c.start_date ZWISCHEN d.start_date UND d.end_date UND c.end_date>d.end_date) ) DANN (a.Enddatum-a.Startdatum+1) WANN (a.id<>b.id UND b.start_date ZWISCHEN a.start_date UND a.end_date UND b.end_date>a.end_date) DANN (b.end_date-a.start_date+1) SONST 0 ENDE ) AS alle_Tage FROM Verkauf a JOIN Verkauf b ON a.Marke=b.Marke GROUP BY a.Marke Ergebnisse der Operation +-------+----------+ | Marke | alle_Tage | +-------+----------+ | Nike | 13 | | Gegenteil | 12 | | vivo | 18 | +-------+----------+ Zu den Bedingungen d.Startdatum ZWISCHEN c.Startdatum UND c.Enddatum UND d.Enddatum>c.Enddatum ODER c.start_date ZWISCHEN d.start_date UND d.end_date UND c.end_date>d.end_date Kann ersetzt werden durch c.Startdatum < d.Enddatum UND (c.Enddatum > d.Startdatum) Das Ergebnis stimmt auch Es ist auch möglich, analytische Funktionen zu verwenden. Ich habe Oracle noch nicht auf meinem Computer installiert, also habe ich es in MySQL geschrieben. Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Zusammenfassung gängiger Befehle zur Linux-Benutzer- und Gruppenverwaltung
>>: So zeichnen Sie die Zeitleiste mit Vue+Canvas
Der spezifische Code lautet wie folgt: <div id...
2048 Minispiel, zu Ihrer Information, der spezifi...
Inhaltsverzeichnis Erstellen von OAuth-Apps Holen...
Wenn wir eine neue CSS-Funktion verwenden möchten...
In diesem Artikel wird der spezifische Code für J...
Bei der tatsächlichen Verwendung ist es häufig er...
Der Container wurde bereits erstellt. So erfahren...
Dieser Artikel beschreibt anhand von Beispielen d...
1. Stoppen Sie zuerst den mysqld.exe-Prozess 2. Ö...
1. Welche Zeilenformate gibt es? Sie können Ihre ...
Dies ist mein erster Blogbeitrag. Aus Zeitgründen...
In diesem Artikel wird der spezifische Code zur I...
In diesem Artikel wird anhand eines Beispiels bes...
laden Anforderung erfolgreich Anforderung fehlges...
Müssen die Felder und Eigenschaften der Tabelle i...