2016-09-24 2 views
0

Ich habe ein sehr spezifisches Problem, wo ich ein Feld mit einem Jahr drin habe. Ich muss in der Lage sein, sie herauszuziehen und eine Abfrage zu haben, die ein Kriterium macht, um jede Reihe zu betrachten und das Jahr auszuwählen, das das größte ist, aber weniger als das Jahr, das aus einer Auswahlliste ausgewählt wird Zeilen, die herausgefiltert werden müssen. Beispiel I habe ID in Spalte 1 als 1,2,3,4 ect in den Zeilen. Aber ich werde ein paar extra 1's sagen, 5 Reihen mit 1's drin. Ich möchte alle zusätzlichen 1 ausfiltern, die nicht das größte Jahr in einer anderen Spalte haben. Daher muss die ID-Spalte verwendet werden, um zu sehen, welche Zeilen verglichen werden können, und dann nur die Zeilen mit dem größten Jahr in der Spalte "Jahr" beibehalten. Es wird eine Gruppe von Gruppierungen geben, die verglichen werden müssen. Sagen Sie alle 2 und dann 3. Behalte immer diejenigen mit dem größten Jahr und filtere diejenigen heraus, die weniger als die größten sind.Meridium SQL Query Design

Unten ist eine Art Basislinienabfrage, die auch unsere Zeilen filtert, die nicht mehr in Betrieb sind.

SELECT CDFT_Test_Results_Primary_M."Equipment ID" "Equipment ID", 
CDFT_Test_Results_Primary_M."Pass/Fail" "Pass/Fail", 
CDFT_Test_Results_Primary_M."Failure Type" "Failure Type", 
CDFT_Test_Results_Primary_M."Desired Interval (MO)" "Desired Interval (MO)", 
CDFT_Test_Results_Primary_M."Task Description" "Task Description", 
CDFT_Test_Results_Primary_M."Year" "Year", 
CDFT_Test_Results_Primary_M."Site" "Site", 
CDFT_Test_Results_Primary_M."Device Type" "Device Type", 
CDFT_Test_Results_Primary_M."Execution Date" "Execution Date", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer" "Eqpt Manufacturer", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer Model Num" "Eqpt Manufacturer Model Num", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer Serial Nu" "Eqpt Manufacturer Serial Nu", 
CDFT_Test_Results_Primary_M."Decommission Year" "Decommission Year", 
CDFT_Test_Results_Primary_M."Commission Year" "Commission Year", 
CDFT_Test_Results_Primary_M."Equipment Key" "Equipment Key", 
CDFT_Test_Results_Primary_M."Test Key" "Test Key" 

FROM (! 'Personal[cmgray1]\Queries\CDFT Updated\CDFT Test Results Primary Multi Year Pre Non-Test') CDFT_Test_Results_Primary_M 

WHERE (((CDFT_Test_Results_Primary_M."Year" <= CDFT_Test_Results_Primary_M."Decommission Year" 
AND CDFT_Test_Results_Primary_M."Year" >= CDFT_Test_Results_Primary_M."Commission Year") 
AND CDFT_Test_Results_Primary_M."Decommission Year" >= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl) 
AND CDFT_Test_Results_Primary_M."Commission Year" <= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl)) 
OR (CDFT_Test_Results_Primary_M."Decommission Year" IS NULL AND CDFT_Test_Results_Primary_M."Commission Year" IS NULL) 
OR (CDFT_Test_Results_Primary_M."Year" >= CDFT_Test_Results_Primary_M."Commission Year" 
AND CDFT_Test_Results_Primary_M."Decommission Year" IS NULL 
AND CDFT_Test_Results_Primary_M."Commission Year" <= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl)) 
OR (CDFT_Test_Results_Primary_M."Year" <= CDFT_Test_Results_Primary_M."Decommission Year" 
AND CDFT_Test_Results_Primary_M."Decommission Year" >= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl) 
AND CDFT_Test_Results_Primary_M."Commission Year" IS NULL)) 

Wie Sie unten sehen können, wenn Sie Gruppe von Geräte-ID Sie mehrere Jahre unter Aufgabe Beschreibung erhalten. Ich würde gerne in der Lage sein, den größten Teil der Gruppe auszuwählen und den Rest herauszufiltern. Zum Beispiel sollte das Jahr 2009 herausgefiltert werden und der Punkt 2013 bleibt für Geräte mit ähnlicher Equipment ID.

enter image description here

+0

Selbst eine Vorstellung von der Richtung, die ich mir ansehen sollte, wäre in Ordnung. Ich bin jetzt schon eine Weile darüber gestolpert. – ColdTeck

+3

Können Sie Ihre eigene Abfrage in diesem Format lesen? Ich konnte nicht. Bitte formatieren Sie es lesbar und reduzieren Sie es auf das Kernproblem. –

+0

welche rdbms alle 3? Wenn Sie alle 3 verwenden, können Sie normalerweise Oracle und Sql-Server herausnehmen, weil MySQL eine der einschränkendsten von funktionsspezifischen Methoden sein wird. Als nächstes stimme ich mit juergen die Abfrage so ab, dass sie lesbar ist. Ich fing an, aber es ist nicht an dir zu tun. Als nächstes bitten Sie um Rat von Leuten, die mehr als wahrscheinlich die Funktionen eines Systems kennen, also brauchen wir die Bilder nicht wirklich, um uns zu sagen, was sie sind. Schließlich sollten Beispieldaten und das gewünschte Ergebnis enthalten sein. Es klingt jedoch so, als müsste man die Beschreibung zu Max Year Less überdenken als Eingabe-Variable cte mit row_number – Matt

Antwort

0

ich von der ID eine Unterabfrage Gruppe bilden schließlich verwendet dann die MAX-Funktion auf dieser Spalte. Dann verwendete ich eine Join-Funktion zurück zur ursprünglichen Abfrage, um genau das zu bekommen, was ich brauchte.