2009-11-06 8 views
5

Disons que j'ai une table de base de données qui ressemble à ceci:T-SQL: Tri par date, puis regroupement?

ID   name  salary  start_date    city  region 
----------- ---------- ----------- ----------------------- ---------- ------ 
      1 Jason   40420 1994-02-01 00:00:00.000 New York W 
      2 Robert   14420 1995-01-02 00:00:00.000 Vancouver N 
      3 Celia   24020 1996-12-03 00:00:00.000 Toronto W 
      4 Linda   40620 1997-11-04 00:00:00.000 New York N 
      5 David   80026 1998-10-05 00:00:00.000 Vancouver W 
      6 James   70060 1999-09-06 00:00:00.000 Toronto N 
      7 Alison   90620 2000-08-07 00:00:00.000 New York W 
      8 Chris   26020 2001-07-08 00:00:00.000 Vancouver N 
      9 Mary    60020 2002-06-09 00:00:00.000 Toronto W 

est-il facile à régler ce problème par start_date descendant, puis pour le groupe les chaque ville par la dernière start_date? Par exemple:

ID   name  salary  start_date    city  region 
----------- ---------- ----------- ----------------------- ---------- ------ 
     9 Mary    60020 2002-06-09 00:00:00.000 Toronto W 
     6 James   70060 1999-09-06 00:00:00.000 Toronto N 
     3 Celia   24020 1996-12-03 00:00:00.000 Toronto W 
     8 Chris   26020 2001-07-08 00:00:00.000 Vancouver N 
     5 David   80026 1998-10-05 00:00:00.000 Vancouver W 
     2 Robert   14420 1995-01-02 00:00:00.000 Vancouver N 
     7 Alison   90620 2000-08-07 00:00:00.000 New York W 
     4 Linda   40620 1997-11-04 00:00:00.000 New York N 
     1 Jason   40420 1994-02-01 00:00:00.000 New York W 

Nous vous remercions de vos réponses.

Répondre

1

Essayez ceci:

SELECT * 
FROM 
    (
    SELECT 
     *, 
     (SELECT MAX(start_date) FROM cities c2 WHERE c1.city = c2.city) AS latest_start_date 
    FROM cities c1 
    ) 
ORDER BY latest_start_date DESC, start_date DESC 

La requête interne vous donnera quelque chose comme ceci:

ID   name  salary  start_date    city  region lastest_start_date 
----------- ---------- ----------- ----------------------- ---------- ------ ------------------- 
      1 Jason   40420 1994-02-01 00:00:00.000 New York W  2000-08-07 00:00:00.000 
      2 Robert   14420 1995-01-02 00:00:00.000 Vancouver N  2001-07-08 00:00:00.000 
      3 Celia   24020 1996-12-03 00:00:00.000 Toronto W  2002-06-09 00:00:00.000 
      4 Linda   40620 1997-11-04 00:00:00.000 New York N  2000-08-07 00:00:00.000 
      5 David   80026 1998-10-05 00:00:00.000 Vancouver W  2001-07-08 00:00:00.000 
      6 James   70060 1999-09-06 00:00:00.000 Toronto N  2002-06-09 00:00:00.000 
      7 Alison   90620 2000-08-07 00:00:00.000 New York W  2000-08-07 00:00:00.000 
      8 Chris   26020 2001-07-08 00:00:00.000 Vancouver N  2001-07-08 00:00:00.000 
      9 Mary    60020 2002-06-09 00:00:00.000 Toronto W  2002-06-09 00:00:00.000 
7

Dans SQL Server 2005 ou plus récent pourrait être comme:

select 
    * 
from 
    (select *,max(start_date) over(partition by city) max_date from tablename) alias 
order by max_date desc, start_date desc 
+0

+1 seule réponse qui sélectionne la table une seule fois – Andomar

+1

Ne pas oublier de commander par start_date desc, après max_date desc. –

+0

+1. Je ne savais pas à propos de la clause OVER. – Heinzi

3
SELECT yourTable.* 
    FROM yourTable INNER JOIN 
     (SELECT city, MAX(start_date) AS max_city_date 
     FROM yourTable 
     GROUP BY city) max_dates 
     ON yourTable.city = max_dates.city 
ORDER BY max_dates.max_city_date DESC, yourTable.city, yourTable.start_date DESC 

Le yourTable.city dans la clause ORDER BY garantit un regroupement cohérent par ville si deux villes ont la même valeur max_city_date.

2

Rejoindre la requête sur elle-même et grouper par nom de ville. Vous pouvez ensuite utiliser la date de début maximale d'une ville dans la clause ORDER BY.

select c1.* 
from cities c1 
left join cities c2 on c1.city = c2.city 
group by c1.id, c1.name, c1.salary, c1.start_date, c1.city, c1.region 
order by max(c2.start_date) desc, c1.city, c1.start_date desc 
+0

Pourquoi la gauche rejoindre? – Thorsten

+0

@IronGoofy: gauche ou intérieure serait à la fois travailler – Andomar

2

La question n'est pas clair ... mais cela produirait la table que vous avez énumérés:

select * 
from MyTable p 
order by 
    (SELECT MAX(start_date) AS max_city_date FROM MyTable WHERE city=p.city) desc, 
    city, 
    start_date desc 

Est-ce ce que vous voulez ?? Donnez-moi d'autres conseils si vous le pouvez.

ID   name  salary  start_date    city  region 
----------- ---------- ----------- ----------------------- ---------- ---------- 
9   Mary  60020  2002-06-09 00:00:00.000 Toronto W 
6   James  70060  1999-09-06 00:00:00.000 Toronto N 
3   Celia  24020  1996-12-03 00:00:00.000 Toronto W 
8   Chris  26020  2001-07-08 00:00:00.000 Vancouver N 
5   David  80026  1998-10-05 00:00:00.000 Vancouver W 
2   Robert  14420  1995-01-02 00:00:00.000 Vancouver N 
7   Alison  90620  2000-08-07 00:00:00.000 NewYork W 
4   Linda  40620  1997-11-04 00:00:00.000 NewYork N 
1   Jason  40420  1994-02-01 00:00:00.000 NewYork W