2016-07-29 17 views
0

Entschuldigung für den schlechten Titel. Ich war mir nicht sicher, wie ich mein Problem beschreiben sollte. Ich habe eine Abfrage geschrieben, die ungefähr 23.000 Datensätze zurückgibt. Viele dieser Datensätze haben ähnliche Informationen und ich möchte nur die Datensätze mit dem Maximum des Feldes dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength auswählen. Ich habe versucht, nach allen anderen ausgewählten Spalten zu gruppieren, aber es scheint nicht richtig zu funktionieren. Ich verstehe SQL nicht ganz, vor allem die Max- und Group-Funktionen. Ich kann einfache Max-Funktionen ausführen, wenn ich nur eine Sache auswählen möchte oder muss. Ich verstehe nicht, wie es funktioniert, wenn ich eine Menge anderer Daten auswählen möchte. Unten ist die Abfrage.Auswählen von Max mit vielen anderen Elementen

SELECT 
    dbo.tblmeterinfo.fldMeterSerialNumber AS "MOP_FNP_Meter", 
    dbo.tblMsgsOnAir_Type8.fldRBuddyId AS "MOP_FNP_FNID", 
    dbo.TBLMETERMAINT.fldmeterid AS "Meter_ID_Helped", 
    dbo.tblMsgsOnAir_Type8.fldCBuddyId AS "FNID_Helped", 
    dbo.fn_dt(dbo.tblMsgsOnAir_Type8.fldRBuddyToi) AS "TOI", 
    dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength AS "Sig_Str", 
    dbo.TBLSAWN_CIS_INFO.SML AS "Buddy_SML", 
    dbo.TBLMETERLIST.fldaddress AS "Buddy_Address", 
    dbo.TBLSAWNGISCOORD.X_COORD AS "X_Coord", 
    dbo.TBLSAWNGISCOORD.Y_COORD AS "Y_Coord" 
FROM dbo.tblMsgsOnAir_Type8 
LEFT OUTER JOIN dbo.TBLMETERLIST 
    ON (dbo.TBLMETERLIST.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
LEFT OUTER JOIN dbo.TBLMETERMAINT 
    ON (dbo.TBLMETERMAINT.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyID) 
LEFT OUTER JOIN dbo.TBLSAWN_CIS_INFO 
    ON (dbo.TBLSAWN_CIS_INFO.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
LEFT OUTER JOIN dbo.TBLSAWNGISCOORD 
    ON (dbo.TBLSAWNGISCOORD.SRV_MAP_LOC = dbo.TBLSAWN_CIS_INFO.SML) 
LEFT OUTER JOIN dbo.tblmeterinfo 
    ON (dbo.tblmeterinfo.fldRepId = dbo.tblMsgsOnAir_Type8.fldRBuddyId) 
WHERE dbo.tblMsgsOnAir_Type8.fldRBuddyId IN (SELECT 
    dbo.tblSAWN_FNPmap.Repid 
FROM dbo.tblSAWN_FNPmap) 
AND dbo.TBLMETERMAINT.fldmeterid IS NOT NULL 

Die Abfrage unten ist einfach und macht was ich will, aber nicht alle anderen Feld bekommen. Diese Abfrage gibt nur 617 Datensätze zurück. Ich möchte, dass die obige Abfrage 617 Datensätze zurückgibt, aber alle anderen Informationen einschließen, die ich ausgewählt habe.

SELECT 
    dbo.TBLMETERMAINT.fldmeterid AS "Meter_ID_Helped", 
    MAX(dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength) AS "Max_Sig" 
FROM dbo.tblMsgsOnAir_Type8 
LEFT OUTER JOIN dbo.TBLMETERMAINT 
    ON (dbo.TBLMETERMAINT.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyID) 
WHERE dbo.tblMsgsOnAir_Type8.fldRBuddyId IN (SELECT 
    dbo.tblSAWN_FNPmap.Repid 
FROM dbo.tblSAWN_FNPmap) 
AND dbo.TBLMETERMAINT.fldmeterid IS NOT NULL 
GROUP BY dbo.TBLMETERMAINT.fldmeterid 

Antwort

0

Wenn Sie Duplikate erhalten haben, haben Sie versucht, SELECT DISTINCT zu verwenden?

Grundsätzlich funktioniert Max so, dass es den höchsten Wert in der Gruppe auswählt.

Also, wenn Sie eine Tabelle:

ID  | VALUE 
1  | 10 
1  | 7 
1  | 9 
2  | 6 
2  | 8 

Und

SELECT ID, MAX (VALUE) FROM TABLE GROUP BY ID

Sie werden den Maximalwert erhalten pro ID

ID | VALUE 
1  | 10 
2  | 8 

Wenn Sie die Max während erhalten möchten nicht Gruppierungs das Ergebnis dann kann man die Gruppe in einer subselect do

SELECT ID, WERT, MAX_VALUE etc etc FROM TABLE join (ID SELECT, MAX (VALUE) AS MAX_VALUE FROM TABLE GROUP BY ID) ON MAX als MAX .ID = TABLE.ID

+1

Danke für die Vorschläge. Ich werde versuchen, die Abfrage Montag zu ändern und zurück zu melden. Ich denke, das macht Sinn. – AdamH

0

Ohne Ihre Tabellenstrukturen genauer zu kennen, kann ich nicht sicher sein, dass dies der beste Weg ist, aber hier ist etwas, was funktionieren sollte. Verwenden Sie die zweite Abfrage als die linke Seite eines linken Joins, um die zusätzlichen Spalten aufzunehmen:

select a.* 
    from (<your 2nd query>) a 
left join dbo.TBLMETERLIST 
    on (a.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
left join <next table> ... 

und so weiter. Sie müssen auch links auf dbo.tblMsgsOnAir_Type8 beitreten, um die Spalten in dieser Tabelle zu übernehmen, so dass es einen zusätzlichen linken Join gibt, der über die erste Abfrage hinausgeht. Übrigens ist es eine gute Idee, den Code hier zu schreiben, damit er lesbar ist. Es erleichtert anderen das Verständnis.

+0

Sorry für die hässliche Post. Ich habe versucht herauszufinden, wie die Abfrage in die Codeformatierung eingefügt werden kann, aber die Option wurde nicht angezeigt. Ich habe keine Option gesehen, um den Beitrag vor dem Posten anzusehen.Wie formatiere ich die Abfragen in der Zukunft? – AdamH

+0

Sie können jeder Codezeile vier Leerzeichen voranstellen; Wenn Sie die Frage eingeben, wird die unten stehende Frage angezeigt, damit Sie sehen können, ob Sie es richtig gemacht haben. –

1

Wahrscheinlich row_number() zur Rettung. Sie können es verwenden, um die besten Datensätze in einer Menge zu finden, mit einer Gruppierung nach irgendeiner Untergruppe. So etwas wie

select * 
from .... 
where row_number over (partition by id order by fldBuddyLinkSigStrength) = 1 

So SQL Server weist eine Zeilennummer innerhalb der Gruppen. Jeder Datensatz wird in diesem Fall nach ID gruppiert, und 1 wird angegeben, wenn es die beste Stärke ist, 2, wenn es der nächste ist usw.

Verwandte Themen