2017-09-01 1 views
0

Si je le tableau suivant:requête pour obtenir des valeurs distinctes uniquement sur le groupe de colonnes

Table name: FOO 
ID | NUMBER | EVENT | NAME | CAR 
1 | 12 | OFFER | Adam | VW 
2 | 13 | ORDER | Adam | VW 
3 | 11 | OFFER | Adam | BMW 
4 | 12 | OFFER | Adam | BMW 
5 | 3 | OFFER | Adam | BMW 
6 | 1 | ORDER | Mark | Mercedes 
7 | 1 | ORDER | Mark | BMW 

La requête doit retourner

Result name: FOO 
ID | NUMBER | EVENT | NAME | CAR 
2 | 13 | ORDER | Adam | VW 
4 | 12 | OFFER | Adam | BMW 
6 | 1 | ORDER | Mark | Mercedes 
7 | 1 | ORDER | Mark | BMW 

Les règles suivantes:

- Get the records which have DISTINCT NAME AND CAR 
- If more than one record with the same NAME AND CAR exists, get the one with MAX NUMBER 
- ID, NUMBER, EVENT should not count towards the DISTINCT row rule 

La plate-forme DB est DB2, mais tout SQL est bon, à ce stade, tant que c'est du SQL pur. Je n'arrive pas à obtenir la règle DISTINCT pour s'appliquer uniquement à (NAME, CAR), sur toute la ligne, et s'il y a plusieurs lignes avec la même (NAME, CAR), obtenir la ligne avec le plus haut NUMBER .

Répondre

2

Dans ansi-92 SQL pur, sans mélange:

select t1.* 
from Foo t1 
inner join 
(
select Name, Car, max(number) as maxNo 
from Foo 
group by Name, Car 
) x2 
on t1.Name = x2.Name 
and t1.Car = x2.car 
and t1.Number = x2.maxNo 
+1

Merci beaucoup, vous êtes venu avec elle si vite ... !!!! Va marquer comme une réponse acceptée dans quelques minutes, quand elle me permet –

+1

@Wilhelm Sorban si la performance est importante assurez-vous de faire un test de performance entre les solutions – MichaelTiefenbacher

+0

Je le ferai certainement! :) Mais comme je l'ai mentionné dans le PO, j'avais besoin d'un SQL pur, qui fonctionnerait dans la plupart des technologies de base de données. –

0

Je pense qu'un groupe peut aider par.

select id, max(number), event, name, car from foo group by name, car 

Ceci fonctionne en MySQL, mais pas en DB. Apparemment, MySQL est beaucoup plus simple.

+0

Cela ne fonctionnera pas, comme vous devez également grouper par événement, id –

+0

http://sqlfiddle.com/#!9/41cd39/8 –

+0

essayez là ... créer une table foo (id int, nombre int, événement varchar (255), nom varchar (255), car varchar (255)); insérer dans les valeurs foo (id, nombre, événement, nom, voiture) (1, 12, 'offre', 'adam', 'vw'); insérer dans les valeurs foo (2, 13, 'order', 'adam', 'vw'); insérer dans les valeurs foo (3, 14, 'offer', 'adam', 'bmw'); insérer dans les valeurs foo (4, 15, 'offer', 'adam', 'bmw'); insérer dans les valeurs foo (5, 16, 'offer', 'adam', 'bmw'); insérer dans les valeurs foo (6, 17, 'order', 'mark', 'vw'); insérer dans les valeurs foo (7, 18, 'order', 'mark', 'bmw'); –

2

Cela devrait faire l'affaire

with temp as (
select id, number, event, name, car, 
     rownumber() over (partition by name, car order by number desc) as rownum 
    from foo 
) 
select id, number, event, name, car from temp 
where rownum = 1 
0

Essayez cette instruction SELECT

SELECT FOO.ID, F.Number, Foo.Event, f.Name, f.Car 
FROM FOO INNER JOIN 
(
    SELECT MAX(Number) AS Number, Name, Car 
    FROM FOO 
    GROUP BY Name, Car 
) F ON FOO.Number = F.Number AND FOO.Name = F.Name AND Foo.Car = F.Car 
ORDER BY FOO.ID