2016-05-09 1 views
0

Ich benutze MySQL. Ich habe eine Tabelle mit Ereignishistorie. Ich versuche das folgende zu erreichenSQL - Erhalte die Anzahl neuer Ereignisse für einen Monat und zeige nur erhöhte Werte an

1) Holen Sie sich die Ereignisse im März 2015, die länger als diejenigen im Februar 2015 dauerte, sofern das Ereignis im Februar 2015 aufgetreten ist. Ein Ereignis kann beliebig oft in einem Monat auftreten. Also, für den Anfang nehme ich nur durchschnittliche Dauer. später wird Perzentil berücksichtigen.

2) Holen Sie sich eine Liste von Ereignissen im März 2015, die für März einzigartig sind (Der Vergleich ist mit Feb zur Zeit. Jedoch in Zukunft kann ich eine Anforderung in den folgenden Zeilen haben - Holen Sie sich einzigartige Ereignisse im März verglichen mit dem letzten 6 Monate - Im Grunde versuchen, herauszufinden, wenn ein neues Ereignis eingeführt wurde)

OUTPUT

ich den Ausgang möchte für (1) zu sehen etwas wie unten

MONTH,EVENT,DURATION 
2015-03,Event1,1030 
2015-03,Event2,365 
2015-03,Event9,1010 

für (2), Würde ich die Ereignisliste gerne wie unten

MONTH,EVENT 
2015-03,Event7 
2015-03,Event2 

Mit repect (1) oben schauen, ich bin die unten Abfrage versucht, aber kann es nicht richtig machen. Es gibt 6 Spalten in der Ausgabe, offensichtlich aufgrund der Art der Abfrage, die ich geschrieben habe.

select 
    * 
from 
(
    (
     select 
      month(EVE_DATE) as mon, 
      EVE_ID as task, 
      truncate(AVG(EVE_DURATION)/1000,2) as eve_dur 
     from 
      EVE_BOOKINGS 
     where 
      EVE_DATE >= '2015-02-01' 
      and EVE_DATE <= '2015-02-31' 
      and dayofweek(EVE_DATE) not in (1,7) 
      and EVE_BOOKER = 'organizer' 
      and EVE_ID <> '' 
     group by 
      mon, 
      task 
     order by 
      eve_dur desc 
    ) t1, 
    ( 
     select 
      month(EVE_DATE) as mon, 
      EVE_ID as task, 
      truncate(AVG(EVE_DURATION)/1000,2) as eve_dur 
     from 
      EVE_BOOKINGS 
     where 
      EVE_DATE >= '2015-03-01' 
      and EVE_DATE <= '2015-03-31' 
      and dayofweek(EVE_DATE) not in (1,7) 
      and EVE_BOOKER = 'organizer' 
      and CONFIDENCE = 'PROD' 
      and EVE_ID <> '' 
     group by 
      mon, 
      task 
     order by 
      eve_dur desc 
    ) t2 
) 
where 
     t2.eve_dur > t1.eve_dur 

Könnte ich bitte Anleitung anfordern, um diese Abfrage richtig zu machen?

+0

sind meinen Sie für (1) alle Ereignisse in Marsch, die länger dauerte als die längste sogar im Februar? Ich gehe auch davon aus, dass wenn im Februar keine Ereignisse stattfinden würden, alle Ereignisse im März gültig wären, richtig? – Webeng

+0

Hallo Webeng - Mit (1) meine ich Frage (1) der 2 genannten Fragen. In der Annahme, ja du bist richtig. – usert4jju7

Antwort

2

Sie haben in Ihrem Beispiel keine Non-Cross-Joins - ich nehme an, Sie wissen nicht, wie Sie sie tun sollen. Zum Beispiel Einzelteil zu erhalten, die im März und Sie Ihre Unterabfrage Konstrukt nehmen und sie so verbinden (Ich bin ein Standard Einrücken Stil mit)

SELECT * 
FROM (
    SELECT month(EVE_DATE) as mon,  EVE_ID as task, truncate(AVG(EVE_DURATION)/1000,2) as eve_dur 
    FROM EVE_BOOKINGS 
    WHERE EVE_DATE >= '2015-02-01' and EVE_DATE <= '2015-02-31' 
    AND dayofweek(EVE_DATE) not in (1,7) 
    AND EVE_ID <> '' 
    GROUP BY mon, task 
) FEB 
JOIN ( 
    SELECT month(EVE_DATE) as mon,  EVE_ID as task, truncate(AVG(EVE_DURATION)/1000,2) as eve_dur 
    FROM EVE_BOOKINGS 
    WHERE EVE_DATE >= '2015-03-01' and EVE_DATE <= '2015-03-31' 
    AND dayofweek(EVE_DATE) not in (1,7) 
    AND EVE_ID <> '' 
    GROUP BY mon, task 
) MAR ON FEB.EVE_ID = MAR.EVE_ID 

Um diejenigen März zu finden, die nicht in FEBRUAR von März wählen, sondern FEBRUAR kommen links und diejenigen finden, die „fehlenden“

Gefällt Ihnen dieses

SELECT * 
FROM (
    SELECT EVE_DATE, EVE_ID 
    FROM EVE_BOOKINGS 
    WHERE EVE_DATE >= '2015-03-01' and EVE_DATE <= '2015-03-31' 
    AND dayofweek(EVE_DATE) not in (1,7) 
    AND EVE_ID <> '' 
) MAR 
LEFT JOIN ( 
    SELECT EVE_DATE, EVE_ID 
    FROM EVE_BOOKINGS 
    WHERE EVE_DATE >= '2015-02-01' and EVE_DATE <= '2015-02-31' 
    AND dayofweek(EVE_DATE) not in (1,7) 
    AND EVE_ID <> '' 
    GROUP BY mon, task 
) FEB ON FEB.EVE_ID = MAR.EVE_ID 
WHERE FEB.EVE_ID is null 
+0

Das funktioniert Hogan. Danke vielmals. – usert4jju7

+0

Hallo Hogan - Wenn ich könnte, könnte ich Ihre Hilfe anfordern auf http: // stackoverflow.com/Fragen/36821068/Mysql-Rang-pro-Monat-über-mehrere-Monate – usert4jju7

+0

@ usert4jju7 - um, Nein. Gordan hat dir die Antwort auf deine Frage gezeigt. Was Ihren Kommentar betrifft - Sie wissen, was die 'MONTH()' Funktion tut - es ist einfach, machen Sie es selbst oder zeigen Sie mir wenigstens eine Anstrengung in einer anderen Frage, bevor ich antworten werde. Oder Sie können mich als Berater einstellen. – Hogan

Verwandte Themen