2009-04-14 5 views
0

En espérant que quelqu'un puisse m'aider avec ça.SQL - Obtenir plus de données avec un GROUP BY

Disons que j'ai une table appelée incoming_data avec 4 colonnes:

primary_key_id 
serial_number 
counter 
selected_color 

Je reçois des données à partir d'une source qui remplit ce tableau. La clé primaire a son identité activée donc elle ne se répète pas. Je vais obtenir des numéros de série en double avec différentes couleurs sélectionnées.

Le compteur augmente constamment en provenance de l'appareil.

Donc, ce que je veux faire est de sélectionner toutes les données que j'ai reçues aujourd'hui, regrouper les données par numéro de série et obtenir uniquement l'enregistrement avec la valeur de compteur la plus élevée.

simple:

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

Cela fonctionne parfaitement, sauf que je veux faire quelque chose avec les informations de couleur que j'ai reçu. Si j'ajoute de la couleur à la sélection, alors j'obtiens TOUS les enregistrements puisque tous les les couleurs que j'ai reçues ce jour-là sont différents. Cela ne marchera pas.

Si je pouvais obtenir le primary_key_id du dossier alors je pourrais juste requête pour la couleur, mais cela ne fonctionne pas non plus, puisque chaque valeur primary_key_id est différente, je les ai tous.

Des suggestions sur une meilleure technique pour ce faire?

Merci!

+0

Quel est votre SGBDR? – Sung

Répondre

2

Extrait de la touche correspondante, puis rejoindre en arrière pour obtenir "non clé". Cela fonctionne dans MS SQL Server et plus tard 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 avec les cas où plusieurs enregistrements ont le même numéro de série et la valeur du compteur max .. Cela va extraire l'un de ces multiples avec le plus grand primary_key_id

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

S'il y a un compteur en double, disons que deux compteurs de périphériques étaient 500 dans la même journée, est-ce que cela causerait un problème puisque nous sommes en train de faire correspondre les compteurs? Il est très possible que les compteurs de plusieurs appareils différents soient les mêmes. –

+0

édité pour traiter des dupes –

0

Salut, je pense que cela pourrait faire ce que vous voulez?

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

+0

Ne fonctionne que pour un numéro de série – gbn

0

Si vous n'avez pas besoin de la couleur exacte de la requête, mais pourrait l'analyser plus tard, essayez ceci:

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

Je suis en train d'obtenir le nombre max de deux tables jointes . J'ai essayé d'utiliser DISTINCT pour éviter les numéros répétitifs, mais j'ai échoué. Ensuite, j'ai trouvé la requête suivante et fonctionne parfaitement sur une seule table, mais je n'ai pas réussi à l'avoir travaillé sur deux tables jointes.

Comment mettre en œuvre la requête suivante sur ma requête: sélectionnez top 10 ConsumptionKWH de PeriodicConsumptions groupe par ConsumptionKWH ordre par min (ConsumptionKWH) asc

nécessaire sur:

"SELECT * FROM" & _ "(SELECT Distinct top 10" & _ "PeriodicConsumptions.ConsumptionKWH," & _ "MeterReadings.MeterNo," & _ "MeterReadings.LastKWH," & _ "MeterReadings.AccountNo," & _ "MeterReadings.MultiplyFactor," & _ "MeterReadings.LastReading," & _ "MeterReadings.ThisMonthReading," & _ "MeterReadings .NumberofDays, "& _ "MeterReadings.ReadingGYear," & _ "MeterReadings.ReadingGMonth," & _ "MeterReadings.ReadingDate" & _ " F ROM MeterReadings, PeriodicConsumptions "& _ "Où MeterReadings.AccountNo = PeriodicConsumptions.AccountNo" & _ "et MeterReadings.ReadingGYear = PeriodicConsumptions.ConsumptionYear" & _ "et MeterReadings.ReadingGMonth = PeriodicConsumptions.ConsumptionMonth" & _ " et MeterReadings .ReadingDate = PeriodicConsumptions.FromDate "& _ " ORDER BY PeriodicConsumptions.ConsumptionKWH desc) comme t "& _ " ORDER BY « ConsumptionKWH asc

Merci

Questions connexes