2016-06-07 9 views
1

Ich habe eine Tabelle "stocks_prices" mit den Einträgen gvkey, iid, datecol und prccd. Sie stellt den Preis (prccd) einer Aktie (dargestellt durch ihren gvkey und iid) auf Datecol (YYYY-MM-DD) dar. Ich möchte alle meine Daten und die gleiche Zeile mit dem Preis am ersten Tag des Monats und neben dem Preis auf datecol - 35 Tage (dh was war sein Preis 35 Tage vorher) suchen, aber es muss sein ein Wochentag (keine Einträge am Wochenende).Wählen Sie den nächsten Wochentag in einem Bereich

Für jetzt habe ich das:

SELECT b1.gvkey, b1.iid, b1.datecol, b1.prccd, 
     b2.datecol as '35days', (b2.prccd - b1.prccd)/b1.prccd 
    FROM stocks_prices b1 
     LEFT JOIN stocks_prices b2 
      ON b1.datecol = DATE_ADD(b2.datecol, INTERVAL 35 DAY) 
      AND b1.gvkey = b2.gvkey 
      AND b1.iid = b2.iid 
    WHERE b1.datecol in ('2015-01-02', '2015-02-02', '2015-03-02', '2015-04-01', '2015-05-01', '2015-06-01', '2015-07-01', '2015-08-03', '2015-09-01', 
     '2015-10-01', '2015-11-02', '2015-12-01') 

Es funktioniert, aber nicht genau so, wie ich will (es sieht genau 35 Tage zurück, ich mag es am nächsten Tag verfügbar dauern). Ich hoffe, es ist keine triviale Frage, ich beginne gerade mit MySQL.

Vielen Dank im Voraus.

+0

Bitte markieren Sie Ihre Frage mit der Datenbank, die Sie verwenden. Außerdem sind Beispieldaten und gewünschte Ergebnisse hilfreich, um zu kommunizieren, was Sie tun möchten. –

Antwort

2

können Sie verwenden, um die WEEKDAY Funktion am nächsten Tag am Anfang des Monats zu erhalten:

  • Wenn der erste Tag ein Samstag ist, verwenden Sie dann den nächsten Montag
  • Wenn der erste Tag ist ein Sonntag, dann nutzen Sie den nächsten Montag
  • Sonst, verwenden Sie sich.

Hier ist die Umsetzung: vor

SELECT 
    CASE WEEKDAY(datecol) 
     WHEN 5 THEN DATE_ADD(datecol, INTERVAL 2 DAY) -- Sat Mon 
     WHEN 6 THEN DATE_ADD(datecol, INTERVAL 1 DAY) -- Sun Mon 
     ELSE datecol 
    END AS first_weekday 
FROM stocks_prices 

Seit -35 Tage genau 5 Wochen. So ist der Wochentag der aktuellen datecol der gleiche wie vor 5 Wochen. Und hier ist das Ergebnis:

SELECT 
    b1.gvkey, 
    b1.iid, 
    b1.datecol, 
    b1.prccd, 
    b2.datecol as '35days', 
    (b2.prccd - b1.prccd)/b1.prccd 
FROM stocks_prices b1 
    LEFT JOIN stocks_prices b2 
     ON b1.datecol = DATE_ADD(b2.datecol, INTERVAL 35 DAY) 
     AND b1.gvkey = b2.gvkey 
     AND b1.iid = b2.iid 
WHERE b1.datecol IN 
(
    SELECT 
     CASE(WEEKDAY(datecol)) 
      WHEN 5 THEN DATE_ADD(datecol, INTERVAL 2 DAY) -- Sat -> Mon 
      WHEN 6 THEN DATE_ADD(datecol, INTERVAL 1 DAY) -- Sun -> Mon 
      ELSE datecol 
     END 
    FROM stocks_prices 
    WHERE DAY(datecol) = 1 
) 
Verwandte Themen