2009-11-06 2 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 

Есть ли легко разобраться в этом по 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 

Благодарим за ответы.

ответ

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

+1

Не забудьте заказать по start_date по алфавиту, после max_date по алфавиту. –

+0

+1. Не знал о предложении 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 

yourTable.city в условие ORDER BY обеспечивает последовательную группировку по городам, если в двух городах одинаковый максимальный_city_date.

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

+0

@IronGoofy: левая или внутренняя работа будет работать – Andomar

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 

 Смежные вопросы

  • Нет связанных вопросов^_^