2009-08-27 7 views
1

J'ai détruit mon cerveau sur ce problème pendant un certain temps. J'ai également passé en revue d'autres questions, mais je n'ai pas réussi. Le problème que j'ai est, j'ai une liste de résultats/table qui a plusieurs rangées avec des colonnes

| ENREGISTREMENT | ID         | DATE                       | UNITTYPESQL - Sélectionnez des lignes uniques parmi un groupe de résultats

| 005DTHGP               | 172     | 2007-09-11   | MBio
| 005DTHGP               | 1966 | 2006-09-12   | Tracker
| 013DTHGP               | 2281 | 2006-11-01   | Tracker
| 013DTHGP               | 2712 | 2008-05-30   | MBio
| 017DTNGP               | 2404 | 2006-10-20   | Tracker
| 017DTNGP               | 508     | 2007-11-10   | MBio


J'essaie de sélectionner des lignes avec des ENREGISTREMENTS uniques et où le DATE est max (le dernier). Les ID ne sont pas proportionnels au DATE, ce qui signifie que l'ID peut être une valeur faible, mais que le DATE est plus élevé que l'autre ligne correspondante et inversement. Par conséquent, je ne peux pas utiliser MAX() à la fois sur la DATE et l'ID et le regroupement ne semble pas fonctionner.

Les résultats que je veux sont les suivants;

| ENREGISTREMENT | ID         | DATE                       | UNITTYPE

| 005DTHGP               | 172     | 2007-09-11   | MBio
| 013DTHGP               | 2712 | 2008-05-30   | MBio
| 017DTNGP               | 508     | 2007-11-10   | MBio

VEUILLEZ AIDER !!!?!?!?!?!?!?

+0

Quelle plateforme? Cela fait un différent de ce que nous pouvons offrir SQL – gbn

+0

J'utilise MS SQL 2005/2008 – Theo

Répondre

1

Vous souhaitez des requêtes intégrées, ce que tous les SQL ne prennent pas en charge. Dans t-sql, vous auriez quelque chose comme

select r.registration, r.recent, t.id, t.unittype 
from ( 
    select registration, max([date]) recent 
    from @tmp 
    group by 
     registration 
    ) r 
left outer join 
    @tmp t 
on r.recent = t.[date] 
and r.registration = t.registration 
+1

Merci. C'est la route que j'avais prise avant de poster ma question. C'est juste qu'il y a des problèmes de performance parce que les données avec lesquelles je travaille sont générées via une vue, et cette méthode crée alors, je suppose, une autre source/vue.Je fais affaire avec quelque chose autour de 9000 enregistrements. Cela aurait été bien si tout cela pouvait se faire en une ligne. Hélas. Merci – Theo

+0

vues peut certainement être cher - envisager de prendre peut-être un instantané des données nécessaires dans une variable de table/table temporaire? – Unsliced

0

Cela devrait fonctionner MySQL:

SELECT registration, id, date, unittype FROM 
    (SELECT registration AS temp_reg, MAX(date) as temp_date 
    FROM table_name GROUP BY registration) AS temp_table 
WHERE registration=temp_reg and date=temp_date 

L'idée est d'utiliser une sous-requête dans une clause FROM qui jette une seule ligne contenant la date et l'enregistrement (les champs soumis à un groupe); puis utilisez la date correcte et l'enregistrement dans une clause WHERE pour récupérer les autres champs de la même ligne.

+0

Il ne vous donnera pas un identifiant de la ligne avec la date maximale. –

+0

... et colonnes ID + UnitType? – gbn

+0

Fait l'édition .. –

0

TSQL:

declare @R table 
(
Registration varchar(16), 
ID int, 
Date datetime, 
UnitType varchar(16) 
) 

insert into @R values ('A','1','20090824','A') 
insert into @R values ('A','2','20090825','B') 

select R.Registration,R.ID,R.UnitType,R.Date from @R R 
inner join 
(select Registration,Max(Date) as Date from @R group by Registration) M 
on R.Registration = M.Registration and R.Date = M.Date 

Cela peut être inefficace si vous avez des milliers de lignes de votre table en fonction de la façon dont la requête est exécutée (à savoir si elle est un rowscan puis une sélection par ligne).

0

Dans PostgreSQL, et en supposant que vos données sont indexées de sorte qu'un tri n'est pas nécessaire (ou il y a si peu de lignes que vous ne me dérange pas une sorte): En prenant chaque ligne dans l'ordre d'enregistrement et la date décroissante, vous obtiendrez la date la plus récente pour chaque enregistrement en premier. DISTINCT jette les enregistrements en double qui suivent.

0
select registration,ID,date,unittype 
from your_table 
where (registration, date) IN (select registration,max(date) 
          from your_table 
          group by registration)  
Questions connexes