2009-11-06 18 views
5

powiedzmy mam tabeli bazy danych, która wygląda tak:T-SQL: Sortowanie według daty, a następnie grupowanie?

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 

Czy istnieje prosty to rozwiązać przez data_początkowa malejącym, następnie dla grupy nich każdego miasta przez najnowszą datą_początkową? Na przykład:

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 

Dziękuję za odpowiedzi.

Odpowiedz

1

Spróbuj tego:

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 

Zapytanie wewnętrzna daje coś takiego:

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

w SQL Server 2005 lub nowszy może być jak:

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 odpowiedzieć tylko, że wybiera stół tylko raz – Andomar

+1

nie zapomnij zamówić przez data_początkowa desc po max_date oszcz. –

+0

+1. Nie wiedziałem o klauzuli 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 

The yourTable.city in klauzula ORDER BY zapewnia spójne grupowanie według miasta, jeśli dwa miasta mają taką samą maksymalną datę ważności.

2

Dołącz zapytanie do siebie i pogrupuj według nazwy miasta. Następnie możesz użyć maksymalnej daty rozpoczęcia dla miasta w klauzuli 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

Dlaczego lewy dołączyć? – Thorsten

+0

@IronGoofy: lewa lub wewnętrzna będzie działać – Andomar

2

Pytanie nie jest jasne ... ale to będzie produkować tabelę Wystawione:

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 

jest to, co chcesz ?? Daj mi trochę więcej wskazówek, jeśli możesz.

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 
Powiązane problemy