2017-06-22 3 views
0

Je suis aux prises avec la façon dont je pourrais utiliser les fonctions d'agrégat SQL et le regroupement pour trouver le bon enregistrement dans ma table. Voici un exemple simplifié. Je veux grouper par B et trouver l'enregistrement avec la valeur minimum de C. Mon problème étant que je dois soit inclure A dans le groupement ou appliquer une fonction agrégée à A, dont aucune ne semble appropriée.Regroupement par une colonne et recherche d'un minimum d'un autre

A | B | C 
7 | 2 | 1 
4 | 2 | 2 

Ce sont des versions simplifiées des deux requêtes que j'ai essayées.

select A, B, min(c) 
from @Table1 
group by B, A 

select min(a), B, min(c) 
from @Table1 
group by B 

La requête devrait retourner ceci:

A | B | C 
7 | 2 | 1 

Et idéalement un seul enregistrement pour plusieurs valeurs de C.

+0

select max (a), min (b), min (c) du tableau – Chanukya

+0

quelle est la sortie désirée dont vous avez besoin, dans cet exemple. –

+0

Peut-il y avoir des liens, c'est-à-dire deux enregistrements avec le même B et C? Est-ce que vous parlez de "Et idéalement, un seul enregistrement pour plusieurs valeurs de C"? Ou voulez-vous dire autre chose? –

Répondre

2

par B vous voulez le voir avec le C minimum Cela peut être réalisé avec ROW_NUMBER:

select a, b, c 
from 
(
    select a, b, c, row_number() over (partition by b order by c) as rn 
    from @Table1 
) ranked 
where rn = 1; 

S'il y a des liens (même B, même C) l'un des les enregistrements sont choisis arbitrairement. Si vous voulez un certain (par exemple moins ou plus grand A), puis étendre la clause ORDER BY. Si vous souhaitez obtenir tous les enregistrements les mieux classés en cas d'égalité, utilisez RANK ou DENSE_RANK au lieu de ROW_NUMBER.

0

devrait également apporter le résultat souhaité:

SELECT mt.* 
FROM mytable mt 
INNER JOIN 
    (
    SELECT B, MIN(C) as C 
     FROM mytable 
    GROUP BY B 
    ) min 
ON mt.B = min.B 
AND mt.C = min.C 
0

Vous voulez que les enregistrements pour lesquels existe pas un autre enregistrement du même B et C inférieure

select * 
from @Table1 t1 
where not exists 
(
    select * 
    from @Table1 better 
    where better.b = t1.b 
    and better.c < t1.c 
); 

S'il y a des liens (même B, même C) vous obtiendrez plusieurs enregistrements par B. Si vous n'en voulez qu'un seul, étendez si possible la clause WHERE ou choisissez une autre solution.

0

Si vous voulez chaque enregistrement avec le min C, vous pouvez utiliser la requête ci-dessous. Si vous voulez un enregistrement par B, vous pouvez utiliser la réponse fournie par Thorsten.

Declare @myTable table (A int, B int, c int) 
insert into @myTable values (7,2,1),(4,2,2),(6,2,1) 

select a,b,c 
from(
     select *, min(c)over(partition by B) minc 
     from @myTable 
     ) D 
where c=minC 
0
Declare @Table1 TABLE 
    (A int, B int, C int) 
; 

INSERT INTO @Table1 
    (A, B, C) 
VALUES 
    (7, 2, 1), 
    (4, 2, 2) 
; 

Script:

Select A.A,A.B,AA.C from 

(select B,MAX(A)A from @Table1 
GROUP BY B)A 
INNER JOIN (
select B,MIN(C)C from @Table1 
GROUP BY B)AA 
ON A.B = AA.B 
0

je pense que ce dont vous avez besoin est

select max(a),min(b),min(c) from table 
0

Vous pouvez écrire la réponse à votre problème comme celui-ci.

sélectionner A, B, MIN (C) En tant que du tableau où B dans ( SELECT Max (B) DE Tableau GROUP BY B )