2009-09-17 6 views
1

Table [myRecords]Récupérer la ligne la plus récente basée sur une colonne avec des données répétées?

 A  |  B  |  C  |  D  |  E  |  F  | 
------------------------------------------------------------------------ 
    1  |  10 | 1/1/09 | abc | aaa | 111 | 
    2  |  10 | 1/2/09 | def | bbb | 222 | 
    3  |  10 | 1/3/09 | ghi | ccc | 333 | 
    4  |  12 | 1/4/09 | jkl | ddd | 444 | 
    5  |  12 | 1/5/09 | mno | eee | 555 | 
    6  |  13 | 1/6/09 | pqr | fff | 666 | 
    7  |  13 | 1/7/09 | stu | ggg | 777 | 
    8  |  14 | 1/8/09 | vwx | hhh | 888 | 
    9  |  14 | 1/9/09 | yza | iii | 999 | 
    10 |  15 | 1/10/09 | bcd | jjj | 101 | 

résultat devrait être (saisissant la plus récente (c) pour chaque distinct (b).

 A  |  B  |  C  |  D  |  E  |  F  | 
------------------------------------------------------------------------ 
    3  |  10 | 1/3/09 | ghi | ccc | 333 | 
    5  |  12 | 1/5/09 | mno | eee | 555 | 
    7  |  13 | 1/7/09 | stu | ggg | 777 | 
    9  |  14 | 1/9/09 | yza | iii | 999 | 
    10 |  15 | 1/10/09 | bcd | jjj | 101 | 

Répondre

2
SELECT * FROM myRecords t1 
WHERE c = (SELECT max(c) FROM myRecords t2 WHERE t2.B = t1.B) 
+0

Je suis goût celui-ci .. Toute raison pour laquelle je ne devrais t? – madcolor

+0

Cela retournera simplement tous les enregistrements où c est 1.10/09 –

+0

Bien sûr? – madcolor

2
select t.* 
from (
    select b, max(c) as maxc 
    from table1 
    group by b 
) tm 
inner join table1 t on tm.b = t.b and tm.maxc = t.c 
0

select t. * De table t rejoindre (sélectionner b, max (c) comme maxc du groupe de tables par b) comme t2 sur tb = t2.b et tc = t2.maxc commander par tb

0

En supposant que la colonne date n'est jamais NULL, je recommande RANK() si au moins SQL Server 2005. Il est beaucoup plus facile à gérer si vous faites des changements, car vous n'avez pas besoin de changer les choses dans la sous-requête. la requête principale

Pour SQL Server 2005 et versions ultérieures:

WITH myRecordsRanked(A,B,C,D,E,F,rk) AS (
    SELECT A,B,C,D,E,F, 
    RANK() OVER (
     PARTITION BY B 
     ORDER BY C DESC 
    ) 
    FROM myRecords 
) 
    SELECT A,B,C,D,E,F 
    FROM myRecordsRanked 
    WHERE rk = 1; 

Sélection du rk = 1 valeurs vous donnera des liens. Utilisez une colonne ORDER BY de rupture de fil si vous avez besoin d'une colonne liée spécifique, ou utilisez ROW_NUMBER si vous n'avez pas besoin d'un choix cohérent parmi les liens et que cela vaut la peine d'éviter le tri supplémentaire.

Pour SQL Server 2000:

SELECT A,B,C,D,E,F 
FROM myRecords 
WHERE NOT EXISTS (
    SELECT * FROM myRecords as R2 
    WHERE R2.B = myRecords.B 
    AND R2.C > myRecords.C 
) 

(. Cela vous donnera également des liens pour dernière date pour une valeur colonne B)

Questions connexes