Obtenir des données à partir de la première et dernière rangée de chaque groupe

J'ai trouvé beaucoup de sujets similaires mais je ne peux pas comprendre assez bien pour résoudre mon cas spécifique.

A avoir une table avec la structure de base suivante:

+------------------------+ | id | session ID | bal | +------------------------+ | 0 | 00000002 | 100 | | 1 | 00000002 | 120 | | 2 | 00000002 | 140 | | 3 | 00000001 | 900 | | 4 | 00000001 | 800 | | 5 | 00000001 | 500 | +------------------------+ 

J'ai besoin de créer une requête (Microsoft SQL) qui renvoie chaque sessionID unique avec les premières inputs ("start") et dernières ("end") bal basées sur la valeur séquentielle de la colonne ID. Le résultat ressemblerait à ceci:

 +---------------------------+ | session ID | start | end | +---------------------------+ | 00000002 | 100 | 140 | | 00000001 | 900 | 500 | +---------------------------+ 

Comment puis-je atteindre cet objective?

EDIT En réponse à votre commentaire, SQL Server prend en charge les fonctions de window. Une façon de searchr les première et dernière valeurs bal par Session ID est:

 select distinct [Session ID] , first_value(bal) over (partition by [Session ID] order by id) as [start] , first_value(bal) over (partition by [Session ID] order by id desc) as [end] from Table1 

Exemple à SQL Fiddle.

Une autre façon (il y en a beaucoup) est l'augmentation et la diminution des numéros de ligne:

 select [Session ID] , max(case when rn1 = 1 then bal end) as [start] , max(case when rn2 = 1 then bal end) as [end] from ( select row_number() over (partition by [Session ID] order by id) as rn1 , row_number() over (partition by [Session ID] order by id desc) as rn2 , * from Table1 ) as SubQueryAlias group by [Session ID] 

Exemple à SQL Fiddle.

Vous pouvez utiliser JOIN et Common Table Expression pour plus de lisibilité:

 with CTE as ( select sessionId, min(id) as firstId, max(id) as lastId from log group by sessionId ) select CTE.sessionId, Log1.bal as start, Log2.bal as [end] from CTE join Log as Log1 on Log1.id = CTE.firstId join Log as Log2 on Log2.id = CTE.lastId 

Voir le violon SQL .

Je suppose que bal est numérique (bien que cela ne doive pas être dans ce cas, car toutes les inputs ont une longueur de 3)

 select sessionID , min(bal) as start , max(bal) as end from table_name group by sessionID 

où "nom_table" est le nom de votre table

En MySQL peut être comme ceci:

 SELECT `session ID`, MIN(bal) AS start, MAX(bal) AS end FROM `yourtable` WHERE `session ID` IN ( SELECT DISTINCT(`session ID`) FROM `yourtable` ); 

SELECT FIRST (nom_colonne), LAST (nom_colonne) FROM nom_table; http://forums.mysql.com/read.php?65,363723,363723