2009-09-24 6 views
1

J'ai une table commeinstruction SQL pour élément commun maximum dans un ensemble

id contact value 
1 A  2 
2 A  3 
3 B  2 
4 B  3 
5 B  4 
6 C  2 

Maintenant, je voudrais obtenir la valeur maximale commune pour un ensemble donné de contacts. Par exemple: si l'ensemble de mes contacts était {A, B}, il renvoyait 3; pour l'ensemble {A, C} il renverrait 2 pour l'ensemble {B} il reviendrait 4

Quelle instruction SQL peut faire cela?

+0

ne devrait-il pas être 4 pour {A, B}? – TheVillageIdiot

+0

Je suppose que ce que OP recherche vraiment, c'est la valeur maximale ** commun ** pour un ensemble donné. {A, B} est 3 car la valeur maximale pour A est 3. – ChssPly76

Répondre

0

Essayez ceci:

SELECT value, count(distinct contact) as cnt 
    FROM my_table 
    WHERE contact IN ('A', 'C') 
    GROUP BY value 
    HAVING cnt = 2 
    ORDER BY value DESC 
    LIMIT 1 

Cette syntaxe est MySQL, peut être différent pour votre base de données. La clause number (2) dans HAVING est le nombre d'éléments dans l'ensemble.

0
SELECT max(value) FROM table WHERE contact IN ('A', 'C') 

Edit: commune max

declare @contacts table (contact nchar(10)) 


insert into @contacts values ('a') 
insert into @contacts values ('b') 


select MAX(value) 
from MyTable 
where (select COUNT(*) from @contacts) = 
     (select COUNT(*) 
     from MyTable t 
     join @contacts c on c.contact = t.contact 
     where t.value = MyTable.value) 
0

la plupart vous diront d'utiliser:

SELECT MAX(t.value) 
    FROM TABLE t 
    WHERE t.contact IN ('A', 'C') 
GROUP BY t.value 
    HAVING COUNT(DISTINCT t.*) = 2 

Couple de mises en garde:

  • Le DISTINCT est la clé, vous pourriez autrement deux rangées de t.contact = 'A'.
  • Le nombre de COUNT(DISTINCT t.*) doit être égal au nombre de valeurs spécifiées dans la IN clause

Ma préférence est d'utiliser JOIN:

SELECT MAX(t.value) 
    FROM TABLE t 
    JOIN TABLE t2 ON t2.value = t.value AND t2.contact = 'C' 
    WHERE t.contact = 'A' 

L'inconvénient est que vous devez faire auto-jointure (joindre à la même table) pour chaque critère (valeur de contact dans ce cas).

Questions connexes