requête sql pour listr les colonnes supplémentaires (sans aggr () & groupby)

Plus tôt aujourd'hui j'ai eu cette question et l'ai résolu, maintenant je suis dans un correctif pour énumérer une colonne de plus (avec des fonctions de classment … si possible)

Ma table pour les véhicules est:

vehNo tTime odo address ABC 2013-02-13 10:30:00 80 denver ABC 2013-02-12 10:30:00 10 boston ABC 2013-02-12 12:30:00 30 berlin ABC 2013-02-13 01:30:00 40 montreal ABC 2013-02-13 02:30:00 40 montreal ABC 2013-02-13 03:30:00 40 montreal XYZ 2013-02-13 03:33:00 44 houston ABC 2013-02-13 04:30:00 60 madrid ABC 2013-02-13 11:30:00 100 alaska 

Actuellement la requête ci-dessous fonctionne bien (listant 3 colonnes entre deux time)

 select vehNo, max(tTime) as [tTime], odo from Table_3 where vehNo = 'ABC' and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00' group by vehNo, odo order by vehNo, odo; 

Donc, sans agrégat () et groupe par je peux avoir 'adresse' comme le 4ème et get le résultat requirejs

 vehNo tTime odo address ABC 2013-02-12 10:30:00 10 boston ABC 2013-02-12 12:30:00 30 berlin ABC 2013-02-13 03:30:00 40 montreal(time latest, ignoring 1:30 & 2:30) ABC 2013-02-13 04:30:00 60 madrid ABC 2013-02-13 10:30:00 80 denver 

Je cours sur SQL Server 2005, il est donc possible d'avoir une fonction de classment.

Essayez ceci à la place:

 WITH CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY vehNo, odo ORDER BY tTime DESC) AS RowNum FROM table_3 where vehNo = 'ABC' and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00' ) SELECT * FROM CTE WHERE RowNum = 1; 

Démo de Fiddle SQL

Vous pouvez utiliser les fonctions de fenêtrage / classment pour get le résultat. Il y a deux options que je peux voir row_number() ou rank() . Lorsque vous utilisez la fonction de fenêtrage, vous utilisez une clause WHERE pour renvoyer uniquement les lignes de rang 1.

Le rank() returnnera plusieurs lignes dans le cas où vous avez deux inputs pour chaque vehNo et l' address en même time. row_number() returnnera seulement la première ligne. Vous devrez donc décider quelle fonction sera la mieux adaptée à votre situation:

 select vehNo, tTime, odo, address from ( select vehNo, tTime, odo, address, rank() over(partition by vehNo, odo order by tTime desc) rnk from yourtable where vehNo = 'ABC' and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00' ) d where rnk = 1 

Voir SQL Fiddle avec démo .

Utilisez un CTE:

 WITH ag ( select vehNo, max(tTime) as [tTime], odo from Table_3 where vehNo = 'ABC' and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00' group by vehNo, odo ) select vehNO, tTime, odo, T.address from ag inner join ag on Table_3 T on ag.vehNo=T.vehNo order by vehNo, odo; 

Fais juste ce qui suit:

 MAX(address) 

Même si c'est un varchar, vous pouvez toujours utiliser MAX.

Avez-vous essayé d'utiliser la fonction row_number() ?

 select row_number() OVER (ORDER BY vehNo) AS period, vehNo, max(tTime) as [tTime], odo from Table_3 where vehNo = 'ABC' and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00' group by vehNo, odo order by vehNo, odo;