2009-11-06 129 views
5

比方說,我有一個數據庫表,看起來像這樣:T-SQL:按日期排序,然後分組?

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 

有一個簡單的起始日期降序排序這一點,那麼對於每一個城市羣他們通過最新的起始日期?例如:

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 

謝謝您的回覆。

回答

1

試試這個:

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 

內查詢會給你這樣的事情:

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

在SQL Server 2005或更高版本可能是這樣的:

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只回答選擇表只有一次 – Andomar 2009-11-06 23:33:03

+1

不要忘記起始日期倒序訂購,MAX_DATE遞減之後。 – 2009-11-07 04:13:39

+0

+1。不知道OVER子句。 – Heinzi 2009-11-07 12:43:24

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 

yourTable.city in如果兩個城市具有相同的max_city_date,則ORDER BY子句可確保城市的分組一致。

2

加入查詢本身,並按城市名稱分組。然後,您可以在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

左邊爲什麼加入? – Thorsten 2009-11-06 23:04:25

+0

@IronGoofy:左或內都可以 – Andomar 2009-11-06 23:08:24

2

的問題是不明確......但是這會產生你列出的表格:

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 

這就是你想要什麼?如果可以的話,給我更多的指點。

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