[英]T-SQL: Sorting by date, then grouping?
假設我有一個如下所示的數據庫表:
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
是否可以通過start_date降序對其進行排序,然后通過最新的start_date對每個城市組進行排序? 例如:
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
謝謝您的回復。
在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
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
,則ORDER BY
子句中的yourTable.city
可確保按城市進行一致的分組。
加入查詢本身,並按城市名稱分組。 然后,您可以在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
問題不明確......但這會產生你列出的表格:
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
試試這個:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.