Fertig: Berechnen Sie für Z-Unternehmen den Durchschnittswert von A über X Tage. Wie mache ich jetzt: Rückgabewert von B für Tag X für Unternehmen mit dem höchsten Durchschnitt von A?

8

(Ich erkläre zuerst mein Problem. Die folgende Tabelle (eine Beispielabfrage) ist verfügbar unter Ссылка obwohl)

Ich habe eine Tabelle mit Lagerinformationen wie folgt:

%Vor%

Was ich brauche ist:

  • für jeden 3 aufeinanderfolgenden Tagen, berechnen Sie die durchschnittliche Bullishness für jedes Unternehmen ( sp100_id )
  • Nehmen Sie den dritten Tag returnpct des Unternehmens mit der höchsten durchschnittlichen Bullishness und speichern Sie es
  • Am Ende berechnen Sie die Summe returnpct , indem Sie die gespeicherte returnpct s
  • addieren

In diesem Beispiel gibt es 5 _date s, daher müssen folgende Paare aufeinanderfolgender Tage erstellt werden:

  • 2011-03-16 , 2011-03-17 , 2011-03-18
  • 2011-03-17 , 2011-03-18 , 2011-03-21 (bitte beachten Sie, 2011-03-19 ist nicht in der Tabelle)
  • 2011-03-18 , 2011-03-21 , 2011-03-22

Um zu dem zurück zu kommen, was ich brauche:

  • Für die ersten drei Tage ist der "Gewinner" Firma 2 mit einer durchschnittlichen Bullshihness von (3,07 + 2,09 + 0,91) / 3 = 2,0233 und einem 3. Tag Return-point von -0,12. Für die anderen 2 "Datumsbereiche" sind die Gewinner Firma 4 (mit durchschnittlicher Bullenihness 2,14 und returnpct 0,50) und Firma 2 wieder (bullsihness 1,67, returnpct 1,10)
  • Die Werte -0.12, 0.50, 1.10 sollten gespeichert werden
  • Der Gesamtrückgabewert wäre dann -0,12 + 0,50 + 1,10 = 1,48, was von der Abfrage (oder dem Skript)
  • zurückgegeben werden sollte

Problem 1: Im obigen Beispiel gibt meine Abfrage den 1. Tag returnpct (1.27) anstelle des 3. Tages returnpct (-0.12) zurück. Wie kann ich das ändern?

Problem 2: Im sqliddle habe ich die erste Gruppe von 3 aufeinanderfolgenden Tagen fest programmiert. Wie kann ich das automatisieren (vielleicht mit PHP), damit ich nicht alle Abfragen manuell eingeben muss? Bitte beachten Sie, dass in der Tabelle Daten fehlen. Wie im Beispiel sollte das Skript das nächste verfügbare Datum in der Tabelle nehmen (also nach 2011-03-18 kommt 2011-03-21 , nicht 2011-03-19 , da es nicht in der Tabelle ist)

Problem 3: Im Beispiel verwende ich 3 aufeinanderfolgende Tage, aber im Idealfall kann ein Skript leicht geändert werden, um eine beliebige andere Anzahl aufeinanderfolgender Tage (2, 4 oder 8) zu nehmen. Folglich sollte der Rückgabewert des 2., 4. oder 8. Tages gespeichert werden.

Wer kann mir bei einigen der Probleme helfen, die ich hier habe? Jede Hilfe wird sehr geschätzt: -)

    
Pr0no 18.08.2012, 12:57
quelle

1 Antwort

3

Die folgende Abfrage führt zu einem großen Teil zu dem, was Sie tun möchten. Es berechnet den 3-Tage-Durchschnitt, dann Bestellungen innerhalb jedes Datums durch den höchsten Durchschnitt:

%Vor%

An diesem Punkt wird die Verwendung von mysql mühsam. Dies wäre viel einfacher in einer Datenbank, die analytische / Windows-Funktionen und die "mit" -Anweisung unterstützt (das ist fast jede Datenbank abgesehen von MySQL: Oracle, Postgres, DB2, SQL Server, zum Beispiel).

Sie können (3) in MySQL mit einer einzigen Abfrage tun, aber es ist ein Schmerz. Vielleicht möchten Sie das in der Anwendungsebene tun.

Danke, dass Sie eine SQL Fiddle eingerichtet haben. Für den Grund allein, werde ich die Frage upvote.

    
Gordon Linoff 18.08.2012, 14:54
quelle

Tags und Links