2009-04-14 7 views
0

Ich hoffe, jemand kann mir dabei helfen.SQL - Holen Sie mehr Daten mit einer GROUP BY

Lets sagen, dass ich eine Tabelle mit 4 Spalten genannt incoming_data:

primary_key_id 
serial_number 
counter 
selected_color 

ich Daten aus einer Quelle erhalten, die diese Tabelle füllt. Der Primärschlüssel hat seine Identität eingeschaltet, so dass es nicht wiederholt wird. Ich erhalte doppelte Seriennummern mit verschiedenen ausgewählten Farben.

Der Zähler steigt ständig von dem Gerät.

Also was ich tun möchte ist, wählen Sie alle Daten, die ich heute erhielt, gruppieren Sie die Daten nach Seriennummer und nur den Datensatz mit dem höchsten Zählerwert.

Ganz einfach:

SELECT  serial_number, MAX(counter) 
FROM  incoming_data 
GROUP BY serial number 

Das funktioniert perfekt, außer, dass ich will etwas mit der Farbinformation tun , die ich erhalten.

Wenn ich Farbe zu der Auswahl hinzufügen, dann bekomme ich alle Datensätze, da alle die Farben, die ich an diesem Tag erhielt, unterschiedlich sind. Das wird nicht funktionieren.

Wenn ich die primary_key_id des Datensatzes bekommen konnte dann konnte ich nur Abfrage für die Farbe, aber das funktioniert auch nicht, da jeder primary_key_id Wert unterscheidet ich sie alle.

Irgendwelche Vorschläge zu einer besseren Technik dafür?

Danke!

+0

Was ist Ihr RDBMS? – Sung

Antwort

2

die entsprechenden Schlüssel extrahieren, dann kommen Sie zurück um "nicht Schlüssel" zu bekommen. Dies funktioniert in MS SQL Server und später Sybase.

SELECT 
    i.serial_number, i.counter, i.selected_color 
FROM 
    (
    SELECT  serial_number, MAX(counter) AS maxc 
    FROM   incoming_data 
    GROUP BY serial number 
    ) max 
    JOIN 
    incoming_data i ON max.serial_number = i.serial_number AND max.maxc = i.counter 
1

EDIT: t odeal mit Fällen, in denen mehrere Datensätze gleiche Seriennummer und max Zählerwert haben .. Dadurch wird die eine dieser Multiples mit dem größten primary_key_id extrahiert

Select * From incoming_data 
    Where primary_key_id In 
     (Select Max(primary_key_id) From incoming_data I 
     Where Counter = 
       (Select Max(counter) From incoming_data 
       Where SerialNumber = I.SerialNumber) 
     Group By SerialNumber) 
+0

Wenn es einen doppelten Zähler gibt, sagen wir zwei Geräte-Zähler waren 500 am selben Tag, würde dies ein Problem verursachen, da wir die Zähler abgleichen? Es ist sehr gut möglich, dass die Zähler von mehreren verschiedenen Geräten gleich sind. –

+0

bearbeitet, um mit Duplikaten zu arbeiten –

0

Hallo ich denke, das könnte tun, was Sie wollen?

SELECT selected_color, serial_number, counter FROM incoming_data GROUP BY serial_number ORDER BY counter DESC LIMIT 1;

+0

Funktioniert nur für eine serial_number – gbn

0

Wenn Sie die genaue Farbe aus der Abfrage nicht brauchen, aber es könnte danach analysieren, versuchen Sie dies:

SELECT  serial_number, MAX(counter), MAX(CONCAT(counter, ':', selected_color)) 
FROM   incoming_data 
GROUP BY serial number 
0

Ich versuche, die max Zahlen zu erhalten aus zwei Tabellen verknüpft . Ich habe versucht, DISTINCT zu verwenden, um Wiederholungszahlen zu vermeiden, aber gescheitert. Dann habe ich die folgende Abfrage gefunden und funktioniert perfekt auf einer einzelnen Tabelle, aber ich habe es nicht geschafft, dass es an verbundenen zwei Tabellen funktioniert hat.

Wie die folgende Abfrage auf meine Anfrage zu implementieren: wählen top 10 ConsumptionKWH von PeriodicConsumptions Gruppe von ConsumptionKWH um von min (ConsumptionKWH) asc

benötigt auf:

"SELECT * FROM" & _ "(SELECT Distinct oben 10" & _ "PeriodischeVerbrauch.KonsumKWH", "& _ " MeterReadings.MeterNo, "& _ "MeterReadings.LastKWH," & _ "MeterReadings.AccountNo," & _ "MeterReadings.MultiplyFactor," & _ "MeterReadings.LastReading," & _ "MeterReadings.ThisMonthReading," & _ "MeterReadings .NumberofDays "& _ "MeterReadings.ReadingGYear" & _ "MeterReadings.ReadingGMonth" & _ "MeterReadings.ReadingDate" & _ " F ROM MeterReadings, PeriodicConsumptions "& _ "Wo MeterReadings.AccountNo = PeriodicConsumptions.AccountNo" & _ "und MeterReadings.ReadingGYear = PeriodicConsumptions.ConsumptionYear" & _ "und MeterReadings.ReadingGMonth = PeriodicConsumptions.ConsumptionMonth" & _ " und MeterReadings .ReadingDate = PeriodicConsumptions.FromDate "& _ " ORDER BY PeriodicConsumptions.ConsumptionKWH DESC) als t "& _ " ORDER BY ConsumptionKWH ASC“

Dank