SQL-Interviewfrage: Ermitteln Sie die Summe der Zeitunterschiede (ignorieren Sie Duplikate)

SQL-Interviewfrage: Ermitteln Sie die Summe der Zeitunterschiede (ignorieren Sie Duplikate)

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

Marke alle_tage
Nike 13
OPPO 12
vivo 18

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:
  • Detaillierte Erklärung zur Berechnung der Zeitdifferenz in PHP und MySql
  • MySQL-Funktion zur Berechnung der Zeitdifferenz
  • Methode zum Berechnen der Zeitdifferenz in PHP und MySQL

<<:  Zusammenfassung gängiger Befehle zur Linux-Benutzer- und Gruppenverwaltung

>>:  So zeichnen Sie die Zeitleiste mit Vue+Canvas

Artikel empfehlen

Native JS-Implementierung des Ladefortschrittsbalkens

Dieser Artikel zeigt einen Spezialeffekt für dyna...

Detaillierte Erklärung des JSON-Dateischreibformats

Inhaltsverzeichnis Was ist JSON Warum diese Techn...

Was Sie über die Transaktionsisolierung von msyql wissen müssen

Was ist eine Transaktion? Eine Transaktion ist ei...

Vue implementiert Video-Upload-Funktion

In diesem Artikelbeispiel wird der spezifische Co...

Schaltflächen und Dropdown-Menüs für Studiennotizen in Bootstrap 3.0

Der vorherige Artikel war eine einfache Überprüfu...

Teilen Sie 8 MySQL-Fallstricke, die Sie erwähnen müssen

MySQL ist einfach zu installieren, schnell und ve...

js zur Realisierung eines Web-Musikplayers

Dieser Artikel enthält einfachen HTML- und Musikp...

Kleines Paging-Design

Lassen Sie unsere Benutzer wählen, ob sie vorwärts...

Verwendung von MySQL-Triggern

Inhaltsverzeichnis 1. Trigger-Einführung 1. Was i...

So verweisen Sie auf jQuery in einer Webseite

Die Referenzierung ist über CDN (Content Delivery ...